TABLE OF CONTENTS


ABINIT/m_opernla_ylm [ Modules ]

[ Top ] [ Modules ]

NAME

  m_opernla_ylm

FUNCTION

COPYRIGHT

  Copyright (C) 2008-2024 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 .

SOURCE

15 #if defined HAVE_CONFIG_H
16 #include "config.h"
17 #endif
18 
19 #include "abi_common.h"
20 
21 module m_opernla_ylm
22 
23  use defs_basis
24  use m_abicore
25  use m_errors
26  use m_xmpi
27 #if defined HAVE_OPENMP
28  use OMP_LIB
29 #endif
30 
31  use defs_abitypes, only : MPI_type
32  use m_time,        only : timab
33 
34  implicit none
35 
36  private

ABINIT/opernla_ylm [ Functions ]

[ Top ] [ Functions ]

NAME

 opernla_ylm

FUNCTION

 For a given wave-function |c>, get all projected scalars
 <p_lmn|c> where |p_lmn> are non-local projectors
   With:
   <p_lmn|c>=4pi/sqrt(vol) (i)^l Sum_g[c(g).f_nl(g).Y_lm(g).exp(2pi.i.g.R)]

INPUTS

  choice=chooses possible output:
         if choice>=0: compute projected scalars
         if choice<0: same as choice>0 but use already computed projected scalars
         if ABS(choice)>1, then compute additional quantities:
           2: compute projected scalars and derivatives wrt atm pos.
           3: compute projected scalars and derivatives wrt strains
           22: compute projected scalars and 2nd derivatives wrt atm pos. and q-vector.
           23: compute projected scalars, derivatives wrt atm pos. and derivatives wrt strains
           25: compute projected scalars and 3rd derivatives wrt atm pos. and two q-vectors.
           4, 24: compute projected scalars, derivatives wrt atm pos.
                  and 2nd derivatives wrt atm pos.
           33: compute projected scalars and 2nd derivatives wrt strain and q-vector.
           5,51,52: compute projected scalars and derivatives wrt wave vector k
           53: compute projected scalars and derivatives wrt wave vector k in direction idir+1 and idir+2 mod 3
           54: compute projected scalars, deriv. wrt atm pos., deriv. wrt wave vector k
               and 2nd derivatives wrt right wave vector k and atm pos.
           55: compute projected scalars, deriv. strains, deriv. wrt wave vector k
               and 2nd derivatives wrt right wave vector k and strain
           6: compute projected scalars, derivatives wrt atm pos., derivatives wrt strains,
              2nd derivatives wrt 2 strains and derivatives wrt strain and atm pos.
           7: not available
           8: compute projected scalars, derivatives wrt wave vector k
              and 2nd derivatives wrt 2 wave vectors k
  cplex=1 if <p_lmn|c> scalars are real or pure imaginary (equivalent to istwfk>1)
        2 if <p_lmn|c> scalars are complex
  dimffnl=second dimension of ffnl
  ffnl(npw,dimffnl,nlmn)= nonlocal quantities containing nonlocal form factors
  ia3=gives the number of the first atom in the subset presently treated
  idir=direction of the - atom to be moved in the case (choice=2,signs=2) or (choice=22,signs=2)
                        - k point direction in the case (choice=5,signs=2)
                        - strain component (1:6) in the case (choice=3,signs=2) or (choice=6,signs=1)
                        - strain component (1:9) in the case (choice=33,signs=2) 
                        - (1:9) components to specify the atom to be moved and the second q-gradient 
                          direction in the case (choice=25,signs=2)
  indlmn(6,nlmn)= array giving l,m,n,lm,ln,s for i=lmn
  istwf_k=option parameter that describes the storage of wfs
  kpg(npw,nkpg)=(k+G) components          for ikpg=1...3   (if nkpg=3 or 9)
       [(k+G)_a].[(k+G)_b] quantities for ikpg=4...9   (if nkpg=9)
       (k+G) Cartesian components for choice==33
  matblk=dimension of the array ph3d
  mpi_enreg=information about MPI parallelization
  ndgxdt=second dimension of dgxdt
  nd2gxdt=second dimension of d2gxdt
  nincat=number of atoms in the subset here treated
  nkpg=second dimension of array kpg (0, 3 or 9)
  nlmn=number of (l,m,n) numbers for current type of atom
  nloalg(3)=governs the choice of the algorithm for non-local operator.
  npw=number of plane waves in reciprocal space
  nspinor=number of spinorial components of the wavefunctions (on current proc)
  ph3d(2,npw,matblk)=three-dimensional phase factors
  [qdir]= optional, direction of the q-gradient (only for choice=22 choice=25 and choice=33) 
  signs=chooses possible output:
   signs=1: compute derivatives in all directions
   signs=2: compute derivative in direction IDIR only
            compatible only with 1st-order derivatives and "single" derivatives
  ucvol=unit cell volume (bohr^3)
  vect(2,npw*my_nspinor)=starting vector in reciprocal space

OUTPUT

  if (choice>1) dgxdt(cplex,ndgxdt,nlmn,nincat,nspinor)=
     gradients of projected scalars wrt coords  (choice=2, 23, 4, 54, 6)
                                    wrt strains (choice=3, 23, 55)
                                    wrt k wave vect. (choice=5, 51, 52, 53, 54, 55, 8)
                                    wrt coords and q vect (choice=22)
                                    wrt coords and two q vects (choice=25)
                                    wrt strains and q vect (choice=33)
  if (choice=4, 24, 33, 54, 55, 6, 8) d2gxdt(cplex,nd2gxdt,nlmn,nincat,nspinor)=
     2nd grads of projected scalars wrt 2 coords (choice=4 or 24)
                                    wrt coords & k wave vect. (choice=54)
                                    wrt strains & k wave vect. (choice=55)
                                    wrt coords & strains (choice=6)
                                    wrt 2 strains (choice=6)
                                    wrt 2 k wave vect. (choice=8)
                                    wrt strains and q vect (choice=33)
     only compatible with signs=1
  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_d2gxdt(nd2gxdt) = used only when cplex = 1
             cplex_d2gxdt(i) = 1 if d2gxdt(1,i,:,:) is real, 2 if it is pure imaginary

SIDE EFFECTS

  gx(cplex,nlmn,nincat,nspinor)= projected scalars - input if choice<0, output if choice>=0

NOTES

 1-The openMP version is different from the standard version:
   the standard version is more effifient on one CPU core.
 2-Operate for one type of atom, and within this given type of atom,
   for a subset of at most nincat atoms.

SOURCE

 147 subroutine opernla_ylm(choice,cplex,cplex_dgxdt,cplex_d2gxdt,dimffnl,d2gxdt,dgxdt,ffnl,gx,&
 148 &       ia3,idir,indlmn,istwf_k,kpg,matblk,mpi_enreg,nd2gxdt,ndgxdt,nincat,nkpg,nlmn,&
 149 &       nloalg,npw,nspinor,ph3d,signs,ucvol,vect,qdir)
 150 
 151 !Arguments ------------------------------------
 152 !scalars
 153  integer,intent(in) :: choice,cplex,dimffnl,ia3,idir,istwf_k,matblk,nd2gxdt
 154  integer,intent(in) :: ndgxdt,nincat,nkpg,nlmn,npw,nspinor,signs
 155  integer,intent(in),optional :: qdir
 156  real(dp),intent(in) :: ucvol
 157  type(MPI_type),intent(in) :: mpi_enreg
 158 !arrays
 159  integer,intent(in) :: indlmn(6,nlmn),nloalg(3)
 160  integer,intent(out) :: cplex_dgxdt(ndgxdt),cplex_d2gxdt(nd2gxdt)
 161  real(dp),intent(in) :: ffnl(npw,dimffnl,nlmn),kpg(npw,nkpg),ph3d(2,npw,matblk)
 162  real(dp),intent(in) :: vect(:,:)
 163  real(dp),intent(out) :: d2gxdt(cplex,nd2gxdt,nlmn,nincat,nspinor)
 164  real(dp),intent(out) :: dgxdt(cplex,ndgxdt,nlmn,nincat,nspinor),gx(cplex,nlmn,nincat,nspinor)
 165 
 166 !Local variables-------------------------------
 167 !scalars
 168  integer :: choice_,gama,gamb,gamc,gamd,ia,iaph3d,ialpha,ibeta,idelta,idelgam
 169  integer :: ierr,igamma,il,ilmn,ipw,ipw0,ipwshft,ispinor,jpw,mu,mu0
 170  integer :: mua,mub,ndir,nthreads,nua1,nua2,nub1,nub2
 171  real(dp), parameter :: two_pi2=two_pi*two_pi
 172  real(dp) :: aux_i,aux_i2,aux_i3,aux_i4
 173  real(dp) :: aux_r,aux_r2,aux_r3,aux_r4
 174  real(dp) :: buffer_i1,buffer_i2,buffer_i3,buffer_i4,buffer_i5,buffer_i6
 175  real(dp) :: buffer_ia,buffer_ib,buffer_ic,buffer_id,buffer_ie,buffer_if
 176  real(dp) :: buffer_r1,buffer_r2,buffer_r3,buffer_r4,buffer_r5,buffer_r6
 177  real(dp) :: buffer_ra,buffer_rb,buffer_rc,buffer_rd,buffer_re,buffer_rf
 178  real(dp) :: kpga,kpgb,kpgc,kpgd,scale,scale2,wt
 179  logical :: check,parity
 180 !arrays
 181  integer,parameter :: alpha(6)=(/1,2,3,3,3,2/),beta(6)=(/1,2,3,2,1,1/)
 182  integer,parameter :: nalpha(9)=(/1,2,3,3,3,2,2,1,1/),nbeta(9)=(/1,2,3,2,1,1,3,3,2/)
 183  integer,parameter :: gamma(3,3)=reshape((/1,6,5,6,2,4,5,4,3/),(/3,3/))
 184  integer,parameter :: ffnl_dir_dat(6)=(/2,3,3,1,1,2/)
 185  integer,parameter :: idir1(9)=(/1,1,1,2,2,2,3,3,3/),idir2(9)=(/1,2,3,1,2,3,1,2,3/)
 186  integer :: ffnl_dir(2)
 187  real(dp) :: tsec(2)
 188 ! real(dp),allocatable :: kpg(:,:)
 189  real(dp),allocatable :: scali(:),scalr(:),scalari(:,:),scalarr(:,:)
 190 ! *************************************************************************
 191 
 192  if (choice==-1) return
 193 
 194 !Useful variables
 195  choice_=abs(choice)
 196  wt=four_pi/sqrt(ucvol);if (cplex==1) wt=2.d0*wt
 197  ipw0=1;if (istwf_k==2.and.mpi_enreg%me_g0_fft==1) ipw0=2
 198  cplex_dgxdt(:)  = 0 ; if (cplex == 1) cplex_dgxdt(:)  = 1
 199  cplex_d2gxdt(:) = 0 ; if (cplex == 1) cplex_d2gxdt(:) = 1
 200  nthreads=1
 201 
 202 !Check compatibility of options
 203  if (signs==1) then
 204 !  signs=1, almost all choices
 205    check=(choice_==0 .or.choice_==1 .or.choice_==2 .or.choice_==3 .or.choice_==4 .or.&
 206 &   choice_==23.or.choice_==24.or.choice_==5 .or.choice_==51.or.choice_==52.or.&
 207 &   choice_==53.or.choice_==54.or.choice_==55.or.&
 208 &   choice_==6 .or.choice_==8 .or.choice_==81)
 209    ABI_CHECK(check,'BUG: choice not compatible (for signs=1)')
 210  end if
 211  if (signs==2) then
 212 !  signs=2,less choices
 213    check=(choice_== 0.or.choice_== 1.or.choice_== 2.or.choice_==3.or.choice_==5.or.&
 214 &  choice_==22.or.choice_==23.or.choice==25.or.choice_==33.or.&
 215 &  choice_==51.or.choice_==52.or.choice_==53.or.choice_==54.or.choice_==55.or.&
 216 &   choice_== 8.or.choice_==81)
 217    ABI_CHECK(check,'BUG: signs=2 not compatible with this choice')
 218  end if
 219  if (choice_==3.and.signs==2) then
 220 !  1<=idir<=6 is  required when choice=3 and signs=2
 221    check=(idir>=1.and.idir<=6)
 222    ABI_CHECK(check,'BUG: choice=3 and signs=2 requires 1<=idir<=6')
 223  else if (choice_==25.and.signs==2) then
 224 !  1<=idir<=9 is  required when choice=25 and signs=2
 225    check=(idir>=1.and.idir<=9)
 226    ABI_CHECK(check,'BUG: choice=25 and signs=2 requires 1<=idir<=9')
 227  else if (choice_==33.and.signs==2) then
 228 !  1<=idir<=9 is  required when choice=33 and signs=2
 229    check=(idir>=1.and.idir<=9)
 230    ABI_CHECK(check,'BUG: choice=33 and signs=2 requires 1<=idir<=9')
 231  else if ((choice_==8.or.choice_==81.or.choice_==54).and.signs==2) then
 232 !  1<=idir<=9 is required when choice=8 and signs=2
 233    check=(idir>=1.and.idir<=9)
 234    ABI_CHECK(check,'BUG: choice=8/81 and signs=2 requires 1<=idir<=9')
 235  else
 236 !  signs=2 requires 1<=idir<=3 when choice>1
 237    check=(signs/=2.or.choice<=1.or.(idir>=1.and.idir<=3))
 238    ABI_CHECK(check,'BUG: signs=2 requires 1<=idir<=3')
 239  end if
 240 
 241 #if defined HAVE_OPENMP
 242  nthreads=OMP_GET_NUM_THREADS()
 243 #endif
 244 
 245 if (opernla_counter>=0) then
 246   if (choice>=0) opernla_counter = opernla_counter + 1
 247   if ((signs==1).and.(choice_==2.or.choice_==4.or.choice_==6.or.choice_==23.or.choice_==24.or.choice_==54)) then
 248     opernla_counter = opernla_counter + 3 ! 3 directions
 249   end if
 250   if ((signs==2).and.(choice_==2)) opernla_counter = opernla_counter + 1 ! 1 direction
 251   if ((signs==1).and.(choice_==3.or.choice_==6.or.choice_==23.or.choice_==55)) opernla_counter = opernla_counter + 6 ! 6 directions
 252   if ((signs==2).and.(choice_==3)) opernla_counter = opernla_counter + 1 ! 1 direction
 253 end if
 254 
 255 !==========================================================================
 256 !========== STANDARD VERSION ==============================================
 257 !==========================================================================
 258 !Parallelization OpenMP on nlmn loops
 259  if (nthreads==1) then
 260 
 261 !  Loop on spinorial components
 262    do ispinor =1,nspinor
 263      ipwshft=(ispinor-1)*npw
 264 
 265 !    Allocate work space
 266      ABI_MALLOC(scali,(npw))
 267      ABI_MALLOC(scalr,(npw))
 268 
 269 !    Loop on atoms (blocking)
 270      do ia=1,nincat
 271        iaph3d=ia;if (nloalg(2)>0) iaph3d=ia+ia3-1
 272 !      Compute c(g).exp(2pi.i.g.R)
 273        do ipw=ipw0,npw
 274          jpw=ipw+ipwshft
 275          scalr(ipw)=(vect(1,jpw)*ph3d(1,ipw,iaph3d)-vect(2,jpw)*ph3d(2,ipw,iaph3d))
 276          scali(ipw)=(vect(2,jpw)*ph3d(1,ipw,iaph3d)+vect(1,jpw)*ph3d(2,ipw,iaph3d))
 277        end do
 278 
 279        if (ipw0==2) then
 280          scalr(1)=half*vect(1,1+ipwshft)*ph3d(1,1,iaph3d)
 281          scali(1)=half*vect(1,1+ipwshft)*ph3d(2,1,iaph3d)
 282        end if
 283 
 284 !      --------------------------------------------------------------------
 285 !      ALL CHOICES:
 286 !      Accumulate Gx
 287 !      --------------------------------------------------------------------
 288 
 289        if (choice>=0) then
 290 
 291          do ilmn=1,nlmn
 292            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
 293            scale=wt;if (il>1) scale=-scale
 294            if (cplex==2) then
 295              buffer_r1 = zero ; buffer_i1 = zero
 296              do ipw=1,npw
 297                buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1,ilmn)
 298                buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1,ilmn)
 299              end do
 300              if (parity) then
 301                gx(1,ilmn,ia,ispinor) = scale*buffer_r1 ; gx(2,ilmn,ia,ispinor) = scale*buffer_i1
 302              else
 303                gx(1,ilmn,ia,ispinor) =-scale*buffer_i1 ; gx(2,ilmn,ia,ispinor) = scale*buffer_r1
 304              end if
 305            else
 306              if (parity) then
 307                buffer_r1 =  zero
 308                do ipw=1,npw
 309                  buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1,ilmn)
 310                end do
 311                gx(1,ilmn,ia,ispinor) = scale*buffer_r1
 312              else
 313                buffer_i1 = zero
 314                do ipw=1,npw
 315                  buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1,ilmn)
 316                end do
 317                gx(1,ilmn,ia,ispinor) =-scale*buffer_i1
 318              end if
 319            end if
 320          end do
 321        end if
 322 
 323 !      --------------------------------------------------------------------
 324 !      CHOICE= 2, 4, 6, 23, 24, 54  --  SIGNS= 1
 325 !      Accumulate dGxdt --- derivative wrt atm pos. --- for all directions
 326 !      --------------------------------------------------------------------
 327        if ((signs==1).and. &
 328 &       (choice_==2.or.choice_==4.or.choice_==6.or.choice_==23.or.choice_==24.or.choice_==54)) then
 329          mu0=1;if (choice_==23.or.choice_==6) mu0=7
 330 
 331          do ilmn=1,nlmn
 332            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
 333            scale=wt;if (il>1) scale=-scale
 334            scale2=two_pi*scale
 335            if (cplex==2) then
 336              buffer_r1 = zero ; buffer_r2 = zero
 337              buffer_r3 = zero ; buffer_i1 = zero
 338              buffer_i2 = zero ; buffer_i3 = zero
 339              do ipw=1,npw
 340                aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
 341                aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
 342                buffer_r1 = buffer_r1 - aux_i*kpg(ipw,1)
 343                buffer_r2 = buffer_r2 - aux_i*kpg(ipw,2)
 344                buffer_r3 = buffer_r3 - aux_i*kpg(ipw,3)
 345                buffer_i1 = buffer_i1 + aux_r*kpg(ipw,1)
 346                buffer_i2 = buffer_i2 + aux_r*kpg(ipw,2)
 347                buffer_i3 = buffer_i3 + aux_r*kpg(ipw,3)
 348              end do
 349              if (parity) then
 350                dgxdt(1,mu0  ,ilmn,ia,ispinor) = scale2*buffer_r1
 351                dgxdt(2,mu0  ,ilmn,ia,ispinor) = scale2*buffer_i1
 352                dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale2*buffer_r2
 353                dgxdt(2,mu0+1,ilmn,ia,ispinor) = scale2*buffer_i2
 354                dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale2*buffer_r3
 355                dgxdt(2,mu0+2,ilmn,ia,ispinor) = scale2*buffer_i3
 356              else
 357                dgxdt(1,mu0  ,ilmn,ia,ispinor) =-scale2*buffer_i1
 358                dgxdt(2,mu0  ,ilmn,ia,ispinor) = scale2*buffer_r1
 359                dgxdt(1,mu0+1,ilmn,ia,ispinor) =-scale2*buffer_i2
 360                dgxdt(2,mu0+1,ilmn,ia,ispinor) = scale2*buffer_r2
 361                dgxdt(1,mu0+2,ilmn,ia,ispinor) =-scale2*buffer_i3
 362                dgxdt(2,mu0+2,ilmn,ia,ispinor) = scale2*buffer_r3
 363              end if
 364            else
 365              if (parity) then
 366                buffer_r1 = zero ; buffer_r2 = zero ; buffer_r3 = zero
 367                do ipw=1,npw
 368                  aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
 369                  buffer_r1 = buffer_r1 - aux_i*kpg(ipw,1)
 370                  buffer_r2 = buffer_r2 - aux_i*kpg(ipw,2)
 371                  buffer_r3 = buffer_r3 - aux_i*kpg(ipw,3)
 372                end do
 373                dgxdt(1,mu0  ,ilmn,ia,ispinor) = scale2*buffer_r1
 374                dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale2*buffer_r2
 375                dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale2*buffer_r3
 376              else
 377                buffer_i1 = zero ; buffer_i2 = zero ; buffer_i3 = zero
 378                do ipw=1,npw
 379                  aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
 380                  buffer_i1 = buffer_i1 + aux_r*kpg(ipw,1)
 381                  buffer_i2 = buffer_i2 + aux_r*kpg(ipw,2)
 382                  buffer_i3 = buffer_i3 + aux_r*kpg(ipw,3)
 383                end do
 384                dgxdt(1,mu0  ,ilmn,ia,ispinor) =-scale2*buffer_i1
 385                dgxdt(1,mu0+1,ilmn,ia,ispinor) =-scale2*buffer_i2
 386                dgxdt(1,mu0+2,ilmn,ia,ispinor) =-scale2*buffer_i3
 387              end if
 388            end if
 389          end do
 390        end if
 391 
 392 !      --------------------------------------------------------------------
 393 !      CHOICE= 2, --  SIGNS= 2
 394 !      Accumulate dGxdt --- derivative wrt atm pos. --- for direction IDIR
 395 !      --------------------------------------------------------------------
 396        if ((signs==2).and.(choice_==2)) then
 397 
 398          mu0=1
 399          do ilmn=1,nlmn
 400            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
 401            scale=wt;if (il>1) scale=-scale
 402            scale2=two_pi*scale
 403            if (cplex==2) then
 404              buffer_r1 = zero ; buffer_i1 = zero
 405              do ipw=1,npw
 406                aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
 407                aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
 408                buffer_r1 = buffer_r1 - aux_i*kpg(ipw,idir)
 409                buffer_i1 = buffer_i1 + aux_r*kpg(ipw,idir)
 410              end do
 411              if (parity) then
 412                dgxdt(1,mu0,ilmn,ia,ispinor) = scale2*buffer_r1
 413                dgxdt(2,mu0,ilmn,ia,ispinor) = scale2*buffer_i1
 414              else
 415                dgxdt(1,mu0,ilmn,ia,ispinor) =-scale2*buffer_i1
 416                dgxdt(2,mu0,ilmn,ia,ispinor) = scale2*buffer_r1
 417              end if
 418            else
 419              if (parity) then
 420                buffer_r1 = zero
 421                do ipw=1,npw
 422                  buffer_r1 = buffer_r1 - scali(ipw)*ffnl(ipw,1,ilmn)*kpg(ipw,idir)
 423                end do
 424                dgxdt(1,mu0,ilmn,ia,ispinor) = scale2*buffer_r1
 425              else
 426                buffer_i1 = zero
 427                do ipw=1,npw
 428                  buffer_i1 = buffer_i1 + scalr(ipw)*ffnl(ipw,1,ilmn)*kpg(ipw,idir)
 429                end do
 430                dgxdt(1,mu0,ilmn,ia,ispinor) =-scale2*buffer_i1
 431              end if
 432            end if
 433          end do
 434        end if
 435 
 436 !      --------------------------------------------------------------------
 437 !      CHOICE= 22 and 25  --  SIGNS= 2
 438 !      Accumulate dGxdt --- derivative wrt atm pos. and one or two q-vectors--- 
 439 !      for directions fixed by IDIR and qdir
 440 !      --------------------------------------------------------------------
 441        if (signs==2.and.(choice_==22.or.choice_==25)) then
 442          !Use same notation as the notes for clarity
 443          if(choice_==22) ialpha=idir
 444          if(choice_==25) ialpha=nalpha(idir)
 445 
 446          mu0=1
 447          do ilmn=1,nlmn
 448            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
 449            scale=wt;if (il>1) scale=-scale
 450            if (cplex==2) then
 451              buffer_r1 = zero ; buffer_i1 = zero
 452              do ipw=1,npw
 453                aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
 454                aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
 455                buffer_r1 = buffer_r1 + aux_r*kpg(ipw,ialpha)
 456                buffer_i1 = buffer_i1 + aux_i*kpg(ipw,ialpha)
 457              end do
 458              if (parity) then
 459                dgxdt(1,mu0,ilmn,ia,ispinor) = scale*buffer_r1
 460                dgxdt(2,mu0,ilmn,ia,ispinor) = scale*buffer_i1
 461              else
 462                dgxdt(1,mu0,ilmn,ia,ispinor) =-scale*buffer_i1
 463                dgxdt(2,mu0,ilmn,ia,ispinor) = scale*buffer_r1
 464              end if
 465            else
 466              if (parity) then
 467                buffer_r1 = zero
 468                do ipw=1,npw
 469                  buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1,ilmn)*kpg(ipw,ialpha)
 470                end do
 471                dgxdt(1,mu0,ilmn,ia,ispinor) = scale*buffer_r1
 472              else
 473                buffer_i1 = zero
 474                do ipw=1,npw
 475                  buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1,ilmn)*kpg(ipw,ialpha)
 476                end do
 477                dgxdt(1,mu0,ilmn,ia,ispinor) =-scale*buffer_i1
 478              end if
 479            end if
 480          end do
 481        end if
 482 
 483 !      --------------------------------------------------------------------
 484 !      CHOICE= 3, 6, 23, 55  -- SIGNS= 1
 485 !      Accumulate dGxdt --- derivative wrt strain --- for all directions
 486 !      --------------------------------------------------------------------
 487        if ((signs==1).and.(choice_==3.or.choice_==6.or.choice_==23.or.choice_==55)) then
 488 
 489          mu0=1
 490          do ilmn=1,nlmn
 491            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
 492            scale=wt;if (il>1) scale=-scale
 493            scale2=half*scale
 494            if (cplex==2) then
 495              buffer_r1 = zero ; buffer_r2 = zero
 496              buffer_r3 = zero ; buffer_r4 = zero
 497              buffer_r5 = zero ; buffer_r6 = zero
 498              buffer_i1 = zero ; buffer_i2 = zero
 499              buffer_i3 = zero ; buffer_i4 = zero
 500              buffer_i5 = zero ; buffer_i6 = zero
 501              do ipw=1,npw
 502                aux_r2 = scalr(ipw)*ffnl(ipw,2,ilmn)
 503                aux_r3 = scalr(ipw)*ffnl(ipw,3,ilmn)
 504                aux_r4 = scalr(ipw)*ffnl(ipw,4,ilmn)
 505                aux_i2 = scali(ipw)*ffnl(ipw,2,ilmn)
 506                aux_i3 = scali(ipw)*ffnl(ipw,3,ilmn)
 507                aux_i4 = scali(ipw)*ffnl(ipw,4,ilmn)
 508                buffer_r1 = buffer_r1 + aux_r2*kpg(ipw,1)
 509                buffer_r2 = buffer_r2 + aux_r3*kpg(ipw,2)
 510                buffer_r3 = buffer_r3 + aux_r4*kpg(ipw,3)
 511                buffer_r4 = buffer_r4 + aux_r4*kpg(ipw,2) + aux_r3*kpg(ipw,3)
 512                buffer_r5 = buffer_r5 + aux_r4*kpg(ipw,1) + aux_r2*kpg(ipw,3)
 513                buffer_r6 = buffer_r6 + aux_r3*kpg(ipw,1) + aux_r2*kpg(ipw,2)
 514                buffer_i1 = buffer_i1 + aux_i2*kpg(ipw,1)
 515                buffer_i2 = buffer_i2 + aux_i3*kpg(ipw,2)
 516                buffer_i3 = buffer_i3 + aux_i4*kpg(ipw,3)
 517                buffer_i4 = buffer_i4 + aux_i4*kpg(ipw,2) + aux_i3*kpg(ipw,3)
 518                buffer_i5 = buffer_i5 + aux_i4*kpg(ipw,1) + aux_i2*kpg(ipw,3)
 519                buffer_i6 = buffer_i6 + aux_i3*kpg(ipw,1) + aux_i2*kpg(ipw,2)
 520              end do
 521              if (parity) then
 522                dgxdt(1,mu0  ,ilmn,ia,ispinor) =-scale*buffer_r1
 523                dgxdt(2,mu0  ,ilmn,ia,ispinor) =-scale*buffer_i1
 524                dgxdt(1,mu0+1,ilmn,ia,ispinor) =-scale*buffer_r2
 525                dgxdt(2,mu0+1,ilmn,ia,ispinor) =-scale*buffer_i2
 526                dgxdt(1,mu0+2,ilmn,ia,ispinor) =-scale*buffer_r3
 527                dgxdt(2,mu0+2,ilmn,ia,ispinor) =-scale*buffer_i3
 528                dgxdt(1,mu0+3,ilmn,ia,ispinor) =-scale2*buffer_r4
 529                dgxdt(2,mu0+3,ilmn,ia,ispinor) =-scale2*buffer_i4
 530                dgxdt(1,mu0+4,ilmn,ia,ispinor) =-scale2*buffer_r5
 531                dgxdt(2,mu0+4,ilmn,ia,ispinor) =-scale2*buffer_i5
 532                dgxdt(1,mu0+5,ilmn,ia,ispinor) =-scale2*buffer_r6
 533                dgxdt(2,mu0+5,ilmn,ia,ispinor) =-scale2*buffer_i6
 534              else
 535                dgxdt(1,mu0  ,ilmn,ia,ispinor) = scale*buffer_i1
 536                dgxdt(2,mu0  ,ilmn,ia,ispinor) =-scale*buffer_r1
 537                dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_i2
 538                dgxdt(2,mu0+1,ilmn,ia,ispinor) =-scale*buffer_r2
 539                dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_i3
 540                dgxdt(2,mu0+2,ilmn,ia,ispinor) =-scale*buffer_r3
 541                dgxdt(1,mu0+3,ilmn,ia,ispinor) = scale2*buffer_i4
 542                dgxdt(2,mu0+3,ilmn,ia,ispinor) =-scale2*buffer_r4
 543                dgxdt(1,mu0+4,ilmn,ia,ispinor) = scale2*buffer_i5
 544                dgxdt(2,mu0+4,ilmn,ia,ispinor) =-scale2*buffer_r5
 545                dgxdt(1,mu0+5,ilmn,ia,ispinor) = scale2*buffer_i6
 546                dgxdt(2,mu0+5,ilmn,ia,ispinor) =-scale2*buffer_r6
 547              end if
 548            else
 549              if (parity) then
 550                buffer_r1 = zero ; buffer_r2 = zero
 551                buffer_r3 = zero ; buffer_r4 = zero
 552                buffer_r5 = zero ; buffer_r6 = zero
 553                do ipw=1,npw
 554                  aux_r2 = scalr(ipw)*ffnl(ipw,2,ilmn)
 555                  aux_r3 = scalr(ipw)*ffnl(ipw,3,ilmn)
 556                  aux_r4 = scalr(ipw)*ffnl(ipw,4,ilmn)
 557                  buffer_r1 = buffer_r1 + aux_r2*kpg(ipw,1)
 558                  buffer_r2 = buffer_r2 + aux_r3*kpg(ipw,2)
 559                  buffer_r3 = buffer_r3 + aux_r4*kpg(ipw,3)
 560                  buffer_r4 = buffer_r4 + aux_r4*kpg(ipw,2) + aux_r3*kpg(ipw,3)
 561                  buffer_r5 = buffer_r5 + aux_r4*kpg(ipw,1) + aux_r2*kpg(ipw,3)
 562                  buffer_r6 = buffer_r6 + aux_r3*kpg(ipw,1) + aux_r2*kpg(ipw,2)
 563                end do
 564                dgxdt(1,mu0  ,ilmn,ia,ispinor) =-scale*buffer_r1
 565                dgxdt(1,mu0+1,ilmn,ia,ispinor) =-scale*buffer_r2
 566                dgxdt(1,mu0+2,ilmn,ia,ispinor) =-scale*buffer_r3
 567                dgxdt(1,mu0+3,ilmn,ia,ispinor) =-scale2*buffer_r4
 568                dgxdt(1,mu0+4,ilmn,ia,ispinor) =-scale2*buffer_r5
 569                dgxdt(1,mu0+5,ilmn,ia,ispinor) =-scale2*buffer_r6
 570              else
 571                buffer_i1 = zero ; buffer_i2 = zero
 572                buffer_i3 = zero ; buffer_i4 = zero
 573                buffer_i5 = zero ; buffer_i6 = zero
 574                do ipw=1,npw
 575                  aux_i2 = scali(ipw)*ffnl(ipw,2,ilmn)
 576                  aux_i3 = scali(ipw)*ffnl(ipw,3,ilmn)
 577                  aux_i4 = scali(ipw)*ffnl(ipw,4,ilmn)
 578                  buffer_i1 = buffer_i1 + aux_i2*kpg(ipw,1)
 579                  buffer_i2 = buffer_i2 + aux_i3*kpg(ipw,2)
 580                  buffer_i3 = buffer_i3 + aux_i4*kpg(ipw,3)
 581                  buffer_i4 = buffer_i4 + aux_i4*kpg(ipw,2) + aux_i3*kpg(ipw,3)
 582                  buffer_i5 = buffer_i5 + aux_i4*kpg(ipw,1) + aux_i2*kpg(ipw,3)
 583                  buffer_i6 = buffer_i6 + aux_i3*kpg(ipw,1) + aux_i2*kpg(ipw,2)
 584                end do
 585                dgxdt(1,mu0  ,ilmn,ia,ispinor) = scale*buffer_i1
 586                dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_i2
 587                dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_i3
 588                dgxdt(1,mu0+3,ilmn,ia,ispinor) = scale2*buffer_i4
 589                dgxdt(1,mu0+4,ilmn,ia,ispinor) = scale2*buffer_i5
 590                dgxdt(1,mu0+5,ilmn,ia,ispinor) = scale2*buffer_i6
 591              end if
 592            end if
 593          end do
 594        end if
 595 
 596 !      --------------------------------------------------------------------
 597 !      CHOICE= 3  --  SIGNS= 2
 598 !      Accumulate dGxdt --- derivative wrt strain --- for direction IDIR
 599 !      --------------------------------------------------------------------
 600        if ((signs==2).and.(choice_==3)) then
 601 
 602          mu0=1;ffnl_dir(1)=1;if (dimffnl>2) ffnl_dir(1)=idir
 603          do ilmn=1,nlmn
 604            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
 605            scale=wt;if (il>1) scale=-scale
 606            if (cplex==2) then
 607              buffer_r1 = zero ; buffer_i1 = zero
 608              do ipw=1,npw
 609                buffer_r1 = buffer_r1 - scalr(ipw)*ffnl(ipw,1+ffnl_dir(1),ilmn)
 610                buffer_i1 = buffer_i1 - scali(ipw)*ffnl(ipw,1+ffnl_dir(1),ilmn)
 611              end do
 612              if (parity) then
 613                dgxdt(1,mu0,ilmn,ia,ispinor) = scale*buffer_r1
 614                dgxdt(2,mu0,ilmn,ia,ispinor) = scale*buffer_i1
 615              else
 616                dgxdt(1,mu0,ilmn,ia,ispinor) =-scale*buffer_i1
 617                dgxdt(2,mu0,ilmn,ia,ispinor) = scale*buffer_r1
 618              end if
 619            else
 620              if (parity) then
 621                buffer_r1 = zero
 622                do ipw=1,npw
 623                  buffer_r1 = buffer_r1 - scalr(ipw)*ffnl(ipw,1+ffnl_dir(1),ilmn)
 624                end do
 625                dgxdt(1,mu0,ilmn,ia,ispinor) = scale*buffer_r1
 626              else
 627                buffer_i1 = zero
 628                do ipw=1,npw
 629                  buffer_i1 = buffer_i1 - scali(ipw)*ffnl(ipw,1+ffnl_dir(1),ilmn)
 630                end do
 631                dgxdt(1,mu0,ilmn,ia,ispinor) =-scale*buffer_i1
 632              end if
 633            end if
 634          end do
 635        end if
 636 
 637 !      --------------------------------------------------------------------
 638 !      CHOICE= 33  --  SIGNS= 2
 639 !      Accumulate dGxdt and d2Gxdt --- mixed derivative wrt strain and q-vector --- 
 640 !      for directions fixed by idir and qdir
 641 !      --------------------------------------------------------------------
 642        if ((signs==2).and.(choice_==33)) then
 643 
 644          !Use same notation as the notes for clarity
 645          ibeta=nalpha(idir)
 646          idelta=nbeta(idir)
 647          igamma=qdir
 648          idelgam=gamma(idelta,igamma)
 649          do ilmn=1,nlmn
 650            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
 651            scale=wt;if (il>1) scale=-scale
 652            if (cplex==2) then
 653              buffer_r1 = zero ; buffer_i1 = zero
 654              buffer_r2 = zero ; buffer_i2 = zero
 655              buffer_r3 = zero ; buffer_i3 = zero
 656              buffer_r4 = zero ; buffer_i4 = zero
 657              buffer_r5 = zero ; buffer_i5 = zero
 658              do ipw=1,npw
 659                aux_r = scalr(ipw)*ffnl(ipw,1+igamma,ilmn)
 660                aux_i = scali(ipw)*ffnl(ipw,1+igamma,ilmn)
 661                buffer_r1 = buffer_r1 + aux_r
 662                buffer_i1 = buffer_i1 + aux_i
 663                buffer_r2 = buffer_r2 + aux_r*kpg(ipw,ibeta)
 664                buffer_i2 = buffer_i2 + aux_i*kpg(ipw,ibeta)
 665                aux_r = scalr(ipw)*ffnl(ipw,1+idelta,ilmn)
 666                aux_i = scali(ipw)*ffnl(ipw,1+idelta,ilmn)
 667                buffer_r3 = buffer_r3 + aux_r
 668                buffer_i3 = buffer_i3 + aux_i
 669                buffer_r4 = buffer_r4 + aux_r*kpg(ipw,ibeta)
 670                buffer_i4 = buffer_i4 + aux_i*kpg(ipw,ibeta)
 671                aux_r = scalr(ipw)*ffnl(ipw,4+idelgam,ilmn)
 672                aux_i = scali(ipw)*ffnl(ipw,4+idelgam,ilmn)
 673                buffer_r5 = buffer_r5 + aux_r*kpg(ipw,ibeta)
 674                buffer_i5 = buffer_i5 + aux_i*kpg(ipw,ibeta)
 675              end do
 676 
 677              if (parity) then
 678                dgxdt(1,1,ilmn,ia,ispinor) = scale*buffer_r1
 679                dgxdt(2,1,ilmn,ia,ispinor) = scale*buffer_i1
 680                dgxdt(1,2,ilmn,ia,ispinor) = scale*buffer_r3
 681                dgxdt(2,2,ilmn,ia,ispinor) = scale*buffer_i3
 682                d2gxdt(1,1,ilmn,ia,ispinor) = scale*buffer_r2
 683                d2gxdt(2,1,ilmn,ia,ispinor) = scale*buffer_i2
 684                d2gxdt(1,2,ilmn,ia,ispinor) = scale*buffer_r4
 685                d2gxdt(2,2,ilmn,ia,ispinor) = scale*buffer_i4
 686                d2gxdt(1,3,ilmn,ia,ispinor) = scale*buffer_r5
 687                d2gxdt(2,3,ilmn,ia,ispinor) = scale*buffer_i5
 688              else
 689                dgxdt(1,1,ilmn,ia,ispinor) =-scale*buffer_i1
 690                dgxdt(2,1,ilmn,ia,ispinor) = scale*buffer_r1
 691                dgxdt(1,2,ilmn,ia,ispinor) =-scale*buffer_i3
 692                dgxdt(2,2,ilmn,ia,ispinor) = scale*buffer_r3
 693                d2gxdt(1,1,ilmn,ia,ispinor) =-scale*buffer_i2
 694                d2gxdt(2,1,ilmn,ia,ispinor) = scale*buffer_r2
 695                d2gxdt(1,2,ilmn,ia,ispinor) =-scale*buffer_i4
 696                d2gxdt(2,2,ilmn,ia,ispinor) = scale*buffer_r4
 697                d2gxdt(1,3,ilmn,ia,ispinor) =-scale*buffer_i5
 698                d2gxdt(2,3,ilmn,ia,ispinor) = scale*buffer_r5
 699              end if
 700            else
 701              if (parity) then
 702                buffer_r1 = zero 
 703                buffer_r2 = zero 
 704                buffer_r3 = zero 
 705                buffer_r4 = zero 
 706                buffer_r5 = zero 
 707                do ipw=1,npw
 708                  aux_r = scalr(ipw)*ffnl(ipw,1+igamma,ilmn)
 709                  buffer_r1 = buffer_r1 + aux_r
 710                  buffer_r2 = buffer_r2 + aux_r*kpg(ipw,ibeta)
 711                  aux_r = scalr(ipw)*ffnl(ipw,1+idelta,ilmn)
 712                  buffer_r3 = buffer_r3 + aux_r
 713                  buffer_r4 = buffer_r4 + aux_r*kpg(ipw,ibeta)
 714                  aux_r = scalr(ipw)*ffnl(ipw,4+idelgam,ilmn)
 715                  buffer_r5 = buffer_r5 + aux_r*kpg(ipw,ibeta)
 716                end do
 717 
 718                  dgxdt(1,1,ilmn,ia,ispinor) = scale*buffer_r1
 719                  dgxdt(1,2,ilmn,ia,ispinor) = scale*buffer_r3
 720                  d2gxdt(1,1,ilmn,ia,ispinor) = scale*buffer_r2
 721                  d2gxdt(1,2,ilmn,ia,ispinor) = scale*buffer_r4
 722                  d2gxdt(1,3,ilmn,ia,ispinor) = scale*buffer_r5
 723              else
 724                buffer_i1 = zero 
 725                buffer_i2 = zero 
 726                buffer_i3 = zero 
 727                buffer_i4 = zero 
 728                buffer_i5 = zero 
 729                do ipw=1,npw
 730                  aux_i = scali(ipw)*ffnl(ipw,1+igamma,ilmn)
 731                  buffer_i1 = buffer_i1 + aux_i
 732                  buffer_i2 = buffer_i2 + aux_i*kpg(ipw,ibeta)
 733                  aux_i = scali(ipw)*ffnl(ipw,1+idelta,ilmn)
 734                  buffer_i3 = buffer_i3 + aux_i
 735                  buffer_i4 = buffer_i4 + aux_i*kpg(ipw,ibeta)
 736                  aux_i = scali(ipw)*ffnl(ipw,4+idelgam,ilmn)
 737                  buffer_i5 = buffer_i5 + aux_i*kpg(ipw,ibeta)
 738                end do
 739 
 740                dgxdt(1,1,ilmn,ia,ispinor) =-scale*buffer_i1
 741                dgxdt(1,2,ilmn,ia,ispinor) =-scale*buffer_i3
 742                d2gxdt(1,1,ilmn,ia,ispinor) =-scale*buffer_i2
 743                d2gxdt(1,2,ilmn,ia,ispinor) =-scale*buffer_i4
 744                d2gxdt(1,3,ilmn,ia,ispinor) =-scale*buffer_i5
 745              end if
 746            end if
 747          end do
 748        end if
 749 
 750 !      --------------------------------------------------------------------
 751 !      CHOICE= 4, 24  -- SIGNS= 1
 752 !      Accumulate d2Gxdt --- 2nd derivative wrt 2 atm pos. --- for all dirs
 753 !      --------------------------------------------------------------------
 754        if ((signs==1).and.(choice_==4.or.choice_==24)) then
 755          mu0=1
 756          do ilmn=1,nlmn
 757            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
 758            scale=wt;if (il>1) scale=-scale
 759            scale2=two_pi2*scale
 760            if (cplex==2) then
 761              buffer_ra = zero ; buffer_rb = zero
 762              buffer_rc = zero ; buffer_rd = zero
 763              buffer_re = zero ; buffer_rf = zero
 764              buffer_ia = zero ; buffer_ib = zero
 765              buffer_ic = zero ; buffer_id = zero
 766              buffer_ie = zero ; buffer_if = zero
 767              do ipw=1,npw
 768                aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
 769                aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
 770                buffer_ra = buffer_ra - aux_r*kpg(ipw,4)
 771                buffer_rb = buffer_rb - aux_r*kpg(ipw,5)
 772                buffer_rc = buffer_rc - aux_r*kpg(ipw,6)
 773                buffer_rd = buffer_rd - aux_r*kpg(ipw,7)
 774                buffer_re = buffer_re - aux_r*kpg(ipw,8)
 775                buffer_rf = buffer_rf - aux_r*kpg(ipw,9)
 776                buffer_ia = buffer_ia - aux_i*kpg(ipw,4)
 777                buffer_ib = buffer_ib - aux_i*kpg(ipw,5)
 778                buffer_ic = buffer_ic - aux_i*kpg(ipw,6)
 779                buffer_id = buffer_id - aux_i*kpg(ipw,7)
 780                buffer_ie = buffer_ie - aux_i*kpg(ipw,8)
 781                buffer_if = buffer_if - aux_i*kpg(ipw,9)
 782              end do
 783              if (parity) then
 784                d2gxdt(1,mu0  ,ilmn,ia,ispinor) = scale2*buffer_ra
 785                d2gxdt(2,mu0  ,ilmn,ia,ispinor) = scale2*buffer_ia
 786                d2gxdt(1,mu0+1,ilmn,ia,ispinor) = scale2*buffer_rb
 787                d2gxdt(2,mu0+1,ilmn,ia,ispinor) = scale2*buffer_ib
 788                d2gxdt(1,mu0+2,ilmn,ia,ispinor) = scale2*buffer_rc
 789                d2gxdt(2,mu0+2,ilmn,ia,ispinor) = scale2*buffer_ic
 790                d2gxdt(1,mu0+3,ilmn,ia,ispinor) = scale2*buffer_rd
 791                d2gxdt(2,mu0+3,ilmn,ia,ispinor) = scale2*buffer_id
 792                d2gxdt(1,mu0+4,ilmn,ia,ispinor) = scale2*buffer_re
 793                d2gxdt(2,mu0+4,ilmn,ia,ispinor) = scale2*buffer_ie
 794                d2gxdt(1,mu0+5,ilmn,ia,ispinor) = scale2*buffer_rf
 795                d2gxdt(2,mu0+5,ilmn,ia,ispinor) = scale2*buffer_if
 796              else
 797                d2gxdt(1,mu0  ,ilmn,ia,ispinor) =-scale2*buffer_ia
 798                d2gxdt(2,mu0  ,ilmn,ia,ispinor) = scale2*buffer_ra
 799                d2gxdt(1,mu0+1,ilmn,ia,ispinor) =-scale2*buffer_ib
 800                d2gxdt(2,mu0+1,ilmn,ia,ispinor) = scale2*buffer_rb
 801                d2gxdt(1,mu0+2,ilmn,ia,ispinor) =-scale2*buffer_ic
 802                d2gxdt(2,mu0+2,ilmn,ia,ispinor) = scale2*buffer_rc
 803                d2gxdt(1,mu0+3,ilmn,ia,ispinor) =-scale2*buffer_id
 804                d2gxdt(2,mu0+3,ilmn,ia,ispinor) = scale2*buffer_rd
 805                d2gxdt(1,mu0+4,ilmn,ia,ispinor) =-scale2*buffer_ie
 806                d2gxdt(2,mu0+4,ilmn,ia,ispinor) = scale2*buffer_re
 807                d2gxdt(1,mu0+5,ilmn,ia,ispinor) =-scale2*buffer_if
 808                d2gxdt(2,mu0+5,ilmn,ia,ispinor) = scale2*buffer_rf
 809              end if
 810            else
 811              if (parity) then
 812                buffer_ra = zero ; buffer_rb = zero
 813                buffer_rc = zero ; buffer_rd = zero
 814                buffer_re = zero ; buffer_rf = zero
 815                do ipw=1,npw
 816                  aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
 817                  aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
 818                  buffer_ra = buffer_ra - aux_r*kpg(ipw,4)
 819                  buffer_rb = buffer_rb - aux_r*kpg(ipw,5)
 820                  buffer_rc = buffer_rc - aux_r*kpg(ipw,6)
 821                  buffer_rd = buffer_rd - aux_r*kpg(ipw,7)
 822                  buffer_re = buffer_re - aux_r*kpg(ipw,8)
 823                  buffer_rf = buffer_rf - aux_r*kpg(ipw,9)
 824                end do
 825                d2gxdt(1,mu0  ,ilmn,ia,ispinor) = scale2*buffer_ra
 826                d2gxdt(1,mu0+1,ilmn,ia,ispinor) = scale2*buffer_rb
 827                d2gxdt(1,mu0+2,ilmn,ia,ispinor) = scale2*buffer_rc
 828                d2gxdt(1,mu0+3,ilmn,ia,ispinor) = scale2*buffer_rd
 829                d2gxdt(1,mu0+4,ilmn,ia,ispinor) = scale2*buffer_re
 830                d2gxdt(1,mu0+5,ilmn,ia,ispinor) = scale2*buffer_rf
 831              else
 832                buffer_ia = zero ; buffer_ib = zero
 833                buffer_ic = zero ; buffer_id = zero
 834                buffer_ie = zero ; buffer_if = zero
 835                do ipw=1,npw
 836                  aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
 837                  aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
 838                  buffer_ia = buffer_ia - aux_i*kpg(ipw,4)
 839                  buffer_ib = buffer_ib - aux_i*kpg(ipw,5)
 840                  buffer_ic = buffer_ic - aux_i*kpg(ipw,6)
 841                  buffer_id = buffer_id - aux_i*kpg(ipw,7)
 842                  buffer_ie = buffer_ie - aux_i*kpg(ipw,8)
 843                  buffer_if = buffer_if - aux_i*kpg(ipw,9)
 844                end do
 845                d2gxdt(1,mu0  ,ilmn,ia,ispinor) =-scale2*buffer_ia
 846                d2gxdt(1,mu0+1,ilmn,ia,ispinor) =-scale2*buffer_ib
 847                d2gxdt(1,mu0+2,ilmn,ia,ispinor) =-scale2*buffer_ic
 848                d2gxdt(1,mu0+3,ilmn,ia,ispinor) =-scale2*buffer_id
 849                d2gxdt(1,mu0+4,ilmn,ia,ispinor) =-scale2*buffer_ie
 850                d2gxdt(1,mu0+5,ilmn,ia,ispinor) =-scale2*buffer_if
 851              end if
 852            end if
 853          end do
 854        end if
 855 
 856 !      --------------------------------------------------------------------
 857 !      CHOICE= 5, 51, 52, 53, 54, 55, 8, 81  --  SIGNS= 1
 858 !      Accumulate dGxdt --- derivative wrt k --- for all directions
 859 !      --------------------------------------------------------------------
 860        if ((signs==1).and.&
 861 &       (choice_==5 .or.choice_==51.or.choice_==52.or.choice_==53.or.&
 862 &       choice_==54.or.choice_==55.or.choice_==8 .or.choice_==81)) then
 863          mu0=1
 864          if (choice_==54) mu0=4
 865          if (choice_==55) mu0=7
 866          do ilmn=1,nlmn
 867            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
 868            scale=wt;if (il>1) scale=-scale
 869            if (cplex==2) then
 870              buffer_r1 = zero ; buffer_r2 = zero
 871              buffer_r3 = zero
 872              buffer_i1 = zero ; buffer_i2 = zero
 873              buffer_i3 = zero
 874              do ipw=1,npw
 875                buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,2,ilmn)
 876                buffer_r2 = buffer_r2 + scalr(ipw)*ffnl(ipw,3,ilmn)
 877                buffer_r3 = buffer_r3 + scalr(ipw)*ffnl(ipw,4,ilmn)
 878                buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,2,ilmn)
 879                buffer_i2 = buffer_i2 + scali(ipw)*ffnl(ipw,3,ilmn)
 880                buffer_i3 = buffer_i3 + scali(ipw)*ffnl(ipw,4,ilmn)
 881              end do
 882              if (parity) then
 883                dgxdt(1,mu0  ,ilmn,ia,ispinor) = scale*buffer_r1
 884                dgxdt(2,mu0  ,ilmn,ia,ispinor) = scale*buffer_i1
 885                dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_r2
 886                dgxdt(2,mu0+1,ilmn,ia,ispinor) = scale*buffer_i2
 887                dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_r3
 888                dgxdt(2,mu0+2,ilmn,ia,ispinor) = scale*buffer_i3
 889              else
 890                dgxdt(1,mu0  ,ilmn,ia,ispinor) =-scale*buffer_i1
 891                dgxdt(2,mu0  ,ilmn,ia,ispinor) = scale*buffer_r1
 892                dgxdt(1,mu0+1,ilmn,ia,ispinor) =-scale*buffer_i2
 893                dgxdt(2,mu0+1,ilmn,ia,ispinor) = scale*buffer_r2
 894                dgxdt(1,mu0+2,ilmn,ia,ispinor) =-scale*buffer_i3
 895                dgxdt(2,mu0+2,ilmn,ia,ispinor) = scale*buffer_r3
 896              end if
 897            else
 898              cplex_dgxdt(mu0:mu0+2) = 2 ! Warning dgxdt is here pure imaginary
 899              if (parity) then
 900                buffer_i1 = zero ; buffer_i2 = zero
 901                buffer_i3 = zero
 902                do ipw=1,npw
 903                  buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,2,ilmn)
 904                  buffer_i2 = buffer_i2 + scali(ipw)*ffnl(ipw,3,ilmn)
 905                  buffer_i3 = buffer_i3 + scali(ipw)*ffnl(ipw,4,ilmn)
 906                end do
 907                dgxdt(1,mu0  ,ilmn,ia,ispinor) = scale*buffer_i1
 908                dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_i2
 909                dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_i3
 910              else
 911                buffer_r1 = zero ; buffer_r2 = zero
 912                buffer_r3 = zero
 913                do ipw=1,npw
 914                  buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,2,ilmn)
 915                  buffer_r2 = buffer_r2 + scalr(ipw)*ffnl(ipw,3,ilmn)
 916                  buffer_r3 = buffer_r3 + scalr(ipw)*ffnl(ipw,4,ilmn)
 917                end do
 918                dgxdt(1,mu0  ,ilmn,ia,ispinor) = scale*buffer_r1
 919                dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_r2
 920                dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_r3
 921              end if
 922            end if
 923          end do
 924        end if
 925 
 926 !      --------------------------------------------------------------------
 927 !      CHOICE= 5, 51, 52, 53, 54, 8, 81  --  SIGNS= 2
 928 !      Accumulate dGxdt --- derivative wrt k ---
 929 !                            for direction IDIR (CHOICE=5,51,52)
 930 !                            for direction IDIR2 (CHOICE=54,81), only if choice > 0
 931 !                            for directions IDIR+1 & IDIR+2 mod 3 (CHOICE=53)
 932 !                            for 2 directions (CHOICE=8), only if choice > 0
 933 !      --------------------------------------------------------------------
 934        if ((signs==2).and.&
 935 &       (choice_==5.or.choice_==51.or.choice_==52.or.choice_==53.or.choice_==54.or. &
 936 &       choice==8.or.choice==81)) then ! Note the use of choice and not choice_=abs(choice)
 937          mu0=1
 938          if (choice_==5.or.choice_==51.or.choice_==52) then
 939 !          We compute the derivative in one direction
 940            ffnl_dir(1)=1;if(dimffnl>2) ffnl_dir(1)=idir
 941            ndir=1
 942          end if
 943          if (choice_==53) then
 944 !          Case 53 though need multiple directions and here ffnl will contain the
 945 !          derivative information in locations 2,3, and 4 corresponding to idir = 1, 2,
 946 !          and 3. Moreover, choice 53 needs the derivatives in direction idir+1 and idir+2 mod 3.
 947 !          The parameter vector ffnl_dir_dat contains the necessary translations in
 948 !          locations 1,2 for idir=1; 3,4 for idir=2; and 5,6 for idir=3.
 949            ffnl_dir(1)=ffnl_dir_dat(2*idir-1);ffnl_dir(2)=ffnl_dir_dat(2*idir)
 950            ndir=2
 951          end if
 952          if (choice_==54) then
 953 !          We compute the derivative in one direction (the second one)
 954            ffnl_dir(1)=1;if(dimffnl>2) ffnl_dir(1)=idir2(idir)
 955            ndir=1
 956          end if
 957          if (choice_==8) then
 958 !          We compute the derivative in two directions
 959 !          depending on the input idir argument
 960            ffnl_dir(1)=idir1(idir);ffnl_dir(2)=idir2(idir)
 961            ndir=2
 962          end if
 963          if (choice_==81) then
 964 !          We compute the derivative in one direction (the second one)
 965            ffnl_dir(1)=idir2(idir)
 966            ndir=1
 967          end if
 968          do mua=1,ndir
 969            mu=mu0+mua-1
 970            do ilmn=1,nlmn
 971              il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
 972              scale=wt;if (il>1) scale=-scale
 973              if (cplex==2) then
 974                buffer_r1 = zero ; buffer_i1 = zero
 975                do ipw=1,npw
 976                  buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1+ffnl_dir(mua),ilmn)
 977                  buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1+ffnl_dir(mua),ilmn)
 978                end do
 979                if (parity) then
 980                  dgxdt(1,mu,ilmn,ia,ispinor) = scale*buffer_r1
 981                  dgxdt(2,mu,ilmn,ia,ispinor) = scale*buffer_i1
 982                else
 983                  dgxdt(1,mu,ilmn,ia,ispinor) =-scale*buffer_i1
 984                  dgxdt(2,mu,ilmn,ia,ispinor) = scale*buffer_r1
 985                end if
 986              else
 987                cplex_dgxdt(mu) = 2 ! Warning dgxdt is here pure imaginary
 988                if (parity) then
 989                  buffer_i1 = zero
 990                  do ipw=1,npw
 991                    buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1+ffnl_dir(mua),ilmn)
 992                  end do
 993                  dgxdt(1,mu,ilmn,ia,ispinor) = scale*buffer_i1
 994                else
 995                  buffer_r1 = zero
 996                  do ipw=1,npw
 997                    buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1+ffnl_dir(mua),ilmn)
 998                  end do
 999                  dgxdt(1,mu,ilmn,ia,ispinor) = scale*buffer_r1
1000                end if
1001              end if
1002            end do
1003          end do
1004        end if
1005 
1006 !      --------------------------------------------------------------------
1007 !      CHOICE= 54  --  SIGNS= 1
1008 !      Accumulate d2Gxdt --- 2nd derivative wrt k and atm. pos --- for all dirs
1009 !      --------------------------------------------------------------------
1010        if ((signs==1).and.(choice_==54)) then
1011          mu0=1
1012          do ilmn=1,nlmn
1013            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
1014            scale=wt;if (il>1) scale=-scale
1015            scale2=two_pi*scale
1016            if (cplex==2) then
1017              do mua=1,3 ! atm. pos
1018                do mub=1,3 ! k
1019                  mu=mu0+(mub-1)+3*(mua-1)
1020                  buffer_r1 = zero ; buffer_i1 = zero
1021                  do ipw=1,npw
1022                    buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
1023                    buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
1024                  end do
1025                  if (parity) then
1026                    d2gxdt(1,mu,ilmn,ia,ispinor) =-scale2*buffer_i1
1027                    d2gxdt(2,mu,ilmn,ia,ispinor) = scale2*buffer_r1
1028                  else
1029                    d2gxdt(1,mu,ilmn,ia,ispinor) =-scale2*buffer_r1
1030                    d2gxdt(2,mu,ilmn,ia,ispinor) =-scale2*buffer_i1
1031                  end if
1032                end do
1033              end do
1034            else
1035              cplex_d2gxdt(mu0:mu0+8) = 2 ! Warning d2gxdt is here pure imaginary
1036              if (parity) then
1037                do mua=1,3 ! atm. pos
1038                  do mub=1,3 ! k
1039                    mu=mu0+(mub-1)+3*(mua-1)
1040                    buffer_r1 = zero
1041                    do ipw=1,npw
1042                      buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
1043                    end do
1044                    d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_r1
1045                  end do
1046                end do
1047              else
1048                do mua=1,3 ! atm. pos
1049                  do mub=1,3 ! k
1050                    mu=mu0+(mub-1)+3*(mua-1)
1051                    buffer_i1 = zero
1052                    do ipw=1,npw
1053                      buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
1054                    end do
1055                    d2gxdt(1,mu,ilmn,ia,ispinor) = -scale2*buffer_i1
1056                  end do
1057                end do
1058              end if
1059            end if
1060          end do
1061        end if
1062 
1063 !      --------------------------------------------------------------------
1064 !      CHOICE= 54  --  SIGNS= 2
1065 !      Accumulate d2Gxdt --- 2nd derivative wrt k and atm. pos --- for direction IDIR
1066 !      --------------------------------------------------------------------
1067        if ((signs==2).and.(choice_==54)) then
1068          mu0=1
1069          !idir= (xx=1, xy=2, xz=3, yx=4, yy=5, yz=6, zx=7, zy=8, zz=9)
1070          mua=idir1(idir) ! atm. pos
1071          mub=1;if(dimffnl>2) mub=idir2(idir) ! k
1072          do ilmn=1,nlmn
1073            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
1074            scale=wt;if (il>1) scale=-scale
1075            scale2=two_pi*scale
1076            if (cplex==2) then
1077              buffer_r1 = zero ; buffer_i1 = zero
1078              do ipw=1,npw
1079                buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
1080                buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
1081              end do
1082              if (parity) then
1083                d2gxdt(1,mu0,ilmn,ia,ispinor) =-scale2*buffer_i1
1084                d2gxdt(2,mu0,ilmn,ia,ispinor) = scale2*buffer_r1
1085              else
1086                d2gxdt(1,mu0,ilmn,ia,ispinor) =-scale2*buffer_r1
1087                d2gxdt(2,mu0,ilmn,ia,ispinor) =-scale2*buffer_i1
1088              end if
1089            else
1090              cplex_d2gxdt(mu0) = 2 ! Warning d2gxdt is here pure imaginary
1091              if (parity) then
1092                buffer_r1 = zero
1093                do ipw=1,npw
1094                  buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
1095                end do
1096                d2gxdt(1,mu0,ilmn,ia,ispinor) = scale2*buffer_r1
1097              else
1098                buffer_i1 = zero
1099                do ipw=1,npw
1100                  buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
1101                end do
1102                d2gxdt(1,mu0,ilmn,ia,ispinor) = -scale2*buffer_i1
1103              end if
1104            end if
1105          end do
1106        end if
1107 
1108 !      --------------------------------------------------------------------
1109 !      CHOICE= 55  --  SIGNS= 1
1110 !      Accumulate d2Gxdt --- 2nd derivative wrt k and strains --- for all dirs
1111 !      --------------------------------------------------------------------
1112        if ((signs==1).and.(choice_==55)) then
1113          mu0=1
1114          do ilmn=1,nlmn
1115            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
1116            scale=wt;if (il>1) scale=-scale
1117            if (cplex==2) then
1118              do mua=1,6 ! strain
1119                do mub=1,3 ! k
1120                  mu=mu0+(mub-1)+3*(mua-1)
1121                  buffer_r1 = zero ; buffer_i1 = zero
1122                  do ipw=1,npw
1123                    aux_r=ffnl(ipw,4+mua ,ilmn)*kpg(ipw,mub)
1124                    buffer_r1 = buffer_r1 + aux_r*scalr(ipw)
1125                    buffer_i1 = buffer_i1 + aux_r*scali(ipw)
1126                  end do
1127                  if (parity) then
1128                    d2gxdt(1,mu,ilmn,ia,ispinor) =-scale*buffer_r1
1129                    d2gxdt(2,mu,ilmn,ia,ispinor) =-scale*buffer_i1
1130                  else
1131                    d2gxdt(1,mu,ilmn,ia,ispinor) = scale*buffer_i1
1132                    d2gxdt(2,mu,ilmn,ia,ispinor) =-scale*buffer_r1
1133                  end if
1134                end do
1135              end do
1136            else
1137              cplex_d2gxdt(mu0:mu0+17) = 2 ! Warning d2gxdt is here pure imaginary
1138              if (parity) then
1139                do mua=1,6 ! strain
1140                  do mub=1,3 ! k
1141                    mu=mu0+(mub-1)+3*(mua-1)
1142                    buffer_i1 = zero
1143                    do ipw=1,npw
1144                      buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,4+mua,ilmn)*kpg(ipw,mub)
1145                    end do
1146                    d2gxdt(1,mu,ilmn,ia,ispinor) =-scale*buffer_i1
1147                  end do
1148                end do
1149              else
1150                do mua=1,6 ! strain
1151                  do mub=1,3 ! k
1152                    mu=mu0+(mub-1)+3*(mua-1)
1153                    buffer_r1 = zero
1154                    do ipw=1,npw
1155                      buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,4+mua,ilmn)*kpg(ipw,mub)
1156                    end do
1157                    d2gxdt(1,mu,ilmn,ia,ispinor) =-scale*buffer_r1
1158                  end do
1159                end do
1160              end if
1161            end if
1162          end do
1163        end if
1164 
1165 !      --------------------------------------------------------------------
1166 !      CHOICE= 6  --  SIGNS= 1
1167 !      Accumulate d2Gxdt --- 2nd derivative wrt atm. pos and strain --- for all dirs
1168 !        --------------------------------------------------------------------
1169        if ((signs==1).and.(choice_==6)) then
1170          mu0=1;if (choice_==6) mu0=37
1171          ABI_MALLOC(scalarr,(npw,4))
1172          ABI_MALLOC(scalari,(npw,4))
1173          do ilmn=1,nlmn
1174            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
1175            scale=wt;if (il>1) scale=-scale
1176            scale2=pi*scale
1177            do mu=1,4
1178              do ipw=1,npw
1179                scalarr(ipw,mu)=scalr(ipw)*ffnl(ipw,mu,ilmn)
1180                scalari(ipw,mu)=scali(ipw)*ffnl(ipw,mu,ilmn)
1181              end do
1182            end do
1183            if(cplex==2) then
1184              do mub=1,6
1185                nub1=alpha(mub);nub2=beta(mub)
1186                do mua=1,3
1187                  mu=mu0+(mua-1)+3*(mub-1)
1188                  buffer_r1 = zero ; buffer_i1 = zero
1189                  do ipw=1,npw
1190                    buffer_r1 = buffer_r1 + kpg(ipw,mua)*(scalarr(ipw,1+nub1)*kpg(ipw,nub2) + &
1191 &                   scalarr(ipw,1+nub2)*kpg(ipw,nub1))
1192                    buffer_i1 = buffer_i1 + kpg(ipw,mua)*(scalari(ipw,1+nub1)*kpg(ipw,nub2) + &
1193 &                   scalari(ipw,1+nub2)*kpg(ipw,nub1))
1194                  end do
1195                  if (parity) then
1196                    d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_i1
1197                    d2gxdt(2,mu,ilmn,ia,ispinor) =-scale2*buffer_r1
1198                  else
1199                    d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_r1
1200                    d2gxdt(2,mu,ilmn,ia,ispinor) = scale2*buffer_i1
1201                  end if
1202                end do
1203              end do
1204            else
1205              if (parity) then
1206                do mub=1,6
1207                  nub1=alpha(mub);nub2=beta(mub)
1208                  do mua=1,3
1209                    mu=mu0+(mua-1)+3*(mub-1)
1210                    buffer_i1 = zero
1211                    do ipw=1,npw
1212                      buffer_i1 = buffer_i1 + kpg(ipw,mua)*(scalari(ipw,1+nub1)*kpg(ipw,nub2) + &
1213 &                     scalari(ipw,1+nub2)*kpg(ipw,nub1))
1214                    end do
1215                    d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_i1
1216                  end do
1217                end do
1218              else
1219                do mub=1,6
1220                  nub1=alpha(mub);nub2=beta(mub)
1221                  do mua=1,3
1222                    mu=mu0+(mua-1)+3*(mub-1)
1223                    buffer_r1 = zero
1224                    do ipw=1,npw
1225                      buffer_r1 = buffer_r1 + kpg(ipw,mua)*(scalarr(ipw,1+nub1)*kpg(ipw,nub2) + &
1226 &                     scalarr(ipw,1+nub2)*kpg(ipw,nub1))
1227                    end do
1228                    d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_r1
1229                  end do
1230                end do
1231              end if
1232            end if
1233          end do
1234          ABI_FREE(scalarr)
1235          ABI_FREE(scalari)
1236        end if
1237 
1238 !      --------------------------------------------------------------------
1239 !      CHOICE= 6  --  SIGNS= 1
1240 !      Accumulate d2Gxdt --- 2nd derivative wrt 2 strains --- for all dirs
1241 !        --------------------------------------------------------------------
1242        if ((signs==1).and.(choice_==6)) then
1243          mu0=1
1244          ABI_MALLOC(scalarr,(npw,10))
1245          ABI_MALLOC(scalari,(npw,10))
1246          do ilmn=1,nlmn
1247            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
1248            scale=wt;if (il>1) scale=-scale
1249            scale2=quarter*scale
1250            do mu=1,10
1251              do ipw=1,npw
1252                scalarr(ipw,mu)=scalr(ipw)*ffnl(ipw,mu,ilmn)
1253                scalari(ipw,mu)=scali(ipw)*ffnl(ipw,mu,ilmn)
1254              end do
1255            end do
1256            if(cplex==2) then
1257              do mub=1,6
1258                nub1=alpha(mub);nub2=beta(mub)
1259                do mua=1,6
1260                  mu=mu0+(mua-1)+6*(mub-1)
1261                  nua1=alpha(mua);nua2=beta(mua)
1262                  gama=gamma(nub1,nua1)
1263                  gamb=gamma(nub2,nua1)
1264                  gamc=gamma(nub1,nua2)
1265                  gamd=gamma(nub2,nua2)
1266                  buffer_r1 = zero ; buffer_i1 = zero
1267                  do ipw=1,npw
1268                    kpga=kpg(ipw,nub1)
1269                    kpgb=kpg(ipw,nub2)
1270                    kpgc=kpg(ipw,nua1)
1271                    kpgd=kpg(ipw,nua2)
1272                    buffer_r1 = buffer_r1 + scalarr(ipw,4+gama)*kpgb*kpgd+scalarr(ipw,4+gamb)*kpga*kpgd &
1273 &                   + scalarr(ipw,4+gamc)*kpgb*kpgc+scalarr(ipw,4+gamd)*kpga*kpgc
1274                    buffer_i1 = buffer_i1 + scalari(ipw,4+gama)*kpgb*kpgd+scalari(ipw,4+gamb)*kpga*kpgd &
1275 &                   + scalari(ipw,4+gamc)*kpgb*kpgc+scalari(ipw,4+gamd)*kpga*kpgc
1276                  end do
1277                  if (parity) then
1278                    d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_r1
1279                    d2gxdt(2,mu,ilmn,ia,ispinor) = scale2*buffer_i1
1280                  else
1281                    d2gxdt(1,mu,ilmn,ia,ispinor) =-scale2*buffer_i1
1282                    d2gxdt(2,mu,ilmn,ia,ispinor) = scale2*buffer_r1
1283                  end if
1284                end do
1285              end do
1286            else
1287              if (parity) then
1288                do mub=1,6
1289                  nub1=alpha(mub);nub2=beta(mub)
1290                  do mua=1,6
1291                    mu=mu0+(mua-1)+6*(mub-1)
1292                    nua1=alpha(mua);nua2=beta(mua)
1293                    gama=gamma(nub1,nua1)
1294                    gamb=gamma(nub2,nua1)
1295                    gamc=gamma(nub1,nua2)
1296                    gamd=gamma(nub2,nua2)
1297                    buffer_r1 = zero
1298                    do ipw=1,npw
1299                      kpga=kpg(ipw,nub1)
1300                      kpgb=kpg(ipw,nub2)
1301                      kpgc=kpg(ipw,nua1)
1302                      kpgd=kpg(ipw,nua2)
1303                      buffer_r1 = buffer_r1 + scalarr(ipw,4+gama)*kpgb*kpgd+scalarr(ipw,4+gamb)*kpga*kpgd &
1304 &                     + scalarr(ipw,4+gamc)*kpgb*kpgc+scalarr(ipw,4+gamd)*kpga*kpgc
1305                    end do
1306                    d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_r1
1307                  end do
1308                end do
1309              else
1310                do mub=1,6
1311                  nub1=alpha(mub);nub2=beta(mub)
1312                  do mua=1,6
1313                    mu=mu0+(mua-1)+6*(mub-1)
1314                    nua1=alpha(mua);nua2=beta(mua)
1315                    gama=gamma(nub1,nua1)
1316                    gamb=gamma(nub2,nua1)
1317                    gamc=gamma(nub1,nua2)
1318                    gamd=gamma(nub2,nua2)
1319                    buffer_i1 = zero
1320                    do ipw=1,npw
1321                      kpga=kpg(ipw,nub1)
1322                      kpgb=kpg(ipw,nub2)
1323                      kpgc=kpg(ipw,nua1)
1324                      kpgd=kpg(ipw,nua2)
1325                      buffer_i1 = buffer_i1 + scalari(ipw,4+gama)*kpgb*kpgd+scalari(ipw,4+gamb)*kpga*kpgd &
1326 &                     + scalari(ipw,4+gamc)*kpgb*kpgc+scalari(ipw,4+gamd)*kpga*kpgc
1327                    end do
1328                    d2gxdt(1,mu,ilmn,ia,ispinor) =-scale2*buffer_i1
1329                  end do
1330                end do
1331              end if
1332            end if
1333          end do
1334          ABI_FREE(scalarr)
1335          ABI_FREE(scalari)
1336        end if
1337 
1338 !      --------------------------------------------------------------------
1339 !      CHOICE= 8, 81  --  SIGNS= 1
1340 !      Accumulate d2Gxdt --- 2nd derivative wrt 2 k wave vect. --- for all dirs
1341 !      --------------------------------------------------------------------
1342        if ((signs==1).and.(choice_==8.or.choice_==81)) then
1343          mu0=1
1344          do ilmn=1,nlmn
1345            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
1346            scale=wt;if (il>1) scale=-scale
1347            if (cplex==2) then
1348              buffer_ra = zero ; buffer_rb = zero
1349              buffer_rc = zero ; buffer_rd = zero
1350              buffer_re = zero ; buffer_rf = zero
1351              buffer_ia = zero ; buffer_ib = zero
1352              buffer_ic = zero ; buffer_id = zero
1353              buffer_ie = zero ; buffer_if = zero
1354              do ipw=1,npw
1355                buffer_ra = buffer_ra + scalr(ipw)*ffnl(ipw,5,ilmn)
1356                buffer_rb = buffer_rb + scalr(ipw)*ffnl(ipw,6,ilmn)
1357                buffer_rc = buffer_rc + scalr(ipw)*ffnl(ipw,7,ilmn)
1358                buffer_rd = buffer_rd + scalr(ipw)*ffnl(ipw,8,ilmn)
1359                buffer_re = buffer_re + scalr(ipw)*ffnl(ipw,9,ilmn)
1360                buffer_rf = buffer_rf + scalr(ipw)*ffnl(ipw,10,ilmn)
1361                buffer_ia = buffer_ia + scali(ipw)*ffnl(ipw,5,ilmn)
1362                buffer_ib = buffer_ib + scali(ipw)*ffnl(ipw,6,ilmn)
1363                buffer_ic = buffer_ic + scali(ipw)*ffnl(ipw,7,ilmn)
1364                buffer_id = buffer_id + scali(ipw)*ffnl(ipw,8,ilmn)
1365                buffer_ie = buffer_ie + scali(ipw)*ffnl(ipw,9,ilmn)
1366                buffer_if = buffer_if + scali(ipw)*ffnl(ipw,10,ilmn)
1367              end do
1368              if (parity) then
1369                d2gxdt(1,mu0  ,ilmn,ia,ispinor) = scale*buffer_ra
1370                d2gxdt(2,mu0  ,ilmn,ia,ispinor) = scale*buffer_ia
1371                d2gxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_rb
1372                d2gxdt(2,mu0+1,ilmn,ia,ispinor) = scale*buffer_ib
1373                d2gxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_rc
1374                d2gxdt(2,mu0+2,ilmn,ia,ispinor) = scale*buffer_ic
1375                d2gxdt(1,mu0+3,ilmn,ia,ispinor) = scale*buffer_rd
1376                d2gxdt(2,mu0+3,ilmn,ia,ispinor) = scale*buffer_id
1377                d2gxdt(1,mu0+4,ilmn,ia,ispinor) = scale*buffer_re
1378                d2gxdt(2,mu0+4,ilmn,ia,ispinor) = scale*buffer_ie
1379                d2gxdt(1,mu0+5,ilmn,ia,ispinor) = scale*buffer_rf
1380                d2gxdt(2,mu0+5,ilmn,ia,ispinor) = scale*buffer_if
1381              else
1382                d2gxdt(1,mu0  ,ilmn,ia,ispinor) =-scale*buffer_ia
1383                d2gxdt(2,mu0  ,ilmn,ia,ispinor) = scale*buffer_ra
1384                d2gxdt(1,mu0+1,ilmn,ia,ispinor) =-scale*buffer_ib
1385                d2gxdt(2,mu0+1,ilmn,ia,ispinor) = scale*buffer_rb
1386                d2gxdt(1,mu0+2,ilmn,ia,ispinor) =-scale*buffer_ic
1387                d2gxdt(2,mu0+2,ilmn,ia,ispinor) = scale*buffer_rc
1388                d2gxdt(1,mu0+3,ilmn,ia,ispinor) =-scale*buffer_id
1389                d2gxdt(2,mu0+3,ilmn,ia,ispinor) = scale*buffer_rd
1390                d2gxdt(1,mu0+4,ilmn,ia,ispinor) =-scale*buffer_ie
1391                d2gxdt(2,mu0+4,ilmn,ia,ispinor) = scale*buffer_re
1392                d2gxdt(1,mu0+5,ilmn,ia,ispinor) =-scale*buffer_if
1393                d2gxdt(2,mu0+5,ilmn,ia,ispinor) = scale*buffer_rf
1394              end if
1395            else
1396              if (parity) then
1397                buffer_ra = zero ; buffer_rb = zero
1398                buffer_rc = zero ; buffer_rd = zero
1399                buffer_re = zero ; buffer_rf = zero
1400                do ipw=1,npw
1401                  buffer_ra = buffer_ra + scalr(ipw)*ffnl(ipw,5,ilmn)
1402                  buffer_rb = buffer_rb + scalr(ipw)*ffnl(ipw,6,ilmn)
1403                  buffer_rc = buffer_rc + scalr(ipw)*ffnl(ipw,7,ilmn)
1404                  buffer_rd = buffer_rd + scalr(ipw)*ffnl(ipw,8,ilmn)
1405                  buffer_re = buffer_re + scalr(ipw)*ffnl(ipw,9,ilmn)
1406                  buffer_rf = buffer_rf + scalr(ipw)*ffnl(ipw,10,ilmn)
1407                end do
1408                d2gxdt(1,mu0  ,ilmn,ia,ispinor) = scale*buffer_ra
1409                d2gxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_rb
1410                d2gxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_rc
1411                d2gxdt(1,mu0+3,ilmn,ia,ispinor) = scale*buffer_rd
1412                d2gxdt(1,mu0+4,ilmn,ia,ispinor) = scale*buffer_re
1413                d2gxdt(1,mu0+5,ilmn,ia,ispinor) = scale*buffer_rf
1414              else
1415                buffer_ia = zero ; buffer_ib = zero
1416                buffer_ic = zero ; buffer_id = zero
1417                buffer_ie = zero ; buffer_if = zero
1418                do ipw=1,npw
1419                  buffer_ia = buffer_ia + scali(ipw)*ffnl(ipw,5,ilmn)
1420                  buffer_ib = buffer_ib + scali(ipw)*ffnl(ipw,6,ilmn)
1421                  buffer_ic = buffer_ic + scali(ipw)*ffnl(ipw,7,ilmn)
1422                  buffer_id = buffer_id + scali(ipw)*ffnl(ipw,8,ilmn)
1423                  buffer_ie = buffer_ie + scali(ipw)*ffnl(ipw,9,ilmn)
1424                  buffer_if = buffer_if + scali(ipw)*ffnl(ipw,10,ilmn)
1425                end do
1426                d2gxdt(1,mu0  ,ilmn,ia,ispinor) =-scale*buffer_ia
1427                d2gxdt(1,mu0+1,ilmn,ia,ispinor) =-scale*buffer_ib
1428                d2gxdt(1,mu0+2,ilmn,ia,ispinor) =-scale*buffer_ic
1429                d2gxdt(1,mu0+3,ilmn,ia,ispinor) =-scale*buffer_id
1430                d2gxdt(1,mu0+4,ilmn,ia,ispinor) =-scale*buffer_ie
1431                d2gxdt(1,mu0+5,ilmn,ia,ispinor) =-scale*buffer_if
1432              end if
1433            end if
1434          end do
1435        end if
1436 
1437 !      --------------------------------------------------------------------
1438 !      CHOICE= 8, 81  --  SIGNS= 2
1439 !      Accumulate d2Gxdt --- 2nd derivative wrt k --- for direction IDIR (Voigt not.)
1440 !      --------------------------------------------------------------------
1441        if ((signs==2).and.(choice_==8.or.choice_==81)) then
1442          mu0=1
1443          !idir= (xx=1, xy=2, xz=3, yx=4, yy=5, yz=6, zx=7, zy=8, zz=9)
1444          mua=idir1(idir);mub=idir2(idir)
1445          !idir->(Voigt) (11->1,22->2,33->3,32->4,31->5,21->6)
1446          ffnl_dir(1)=gamma(mua,mub)
1447          do ilmn=1,nlmn
1448            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
1449            scale=wt;if (il>1) scale=-scale
1450            if (cplex==2) then
1451              buffer_r1 = zero ; buffer_i1 = zero
1452              do ipw=1,npw
1453                buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,4+ffnl_dir(1),ilmn)
1454                buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,4+ffnl_dir(1),ilmn)
1455              end do
1456              if (parity) then
1457                d2gxdt(1,mu0,ilmn,ia,ispinor) = scale*buffer_r1
1458                d2gxdt(2,mu0,ilmn,ia,ispinor) = scale*buffer_i1
1459              else
1460                d2gxdt(1,mu0,ilmn,ia,ispinor) =-scale*buffer_i1
1461                d2gxdt(2,mu0,ilmn,ia,ispinor) = scale*buffer_r1
1462              end if
1463            else
1464              if (parity) then
1465                buffer_r1 = zero
1466                do ipw=1,npw
1467                  buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,4+ffnl_dir(1),ilmn)
1468                end do
1469                d2gxdt(1,mu0,ilmn,ia,ispinor) = scale*buffer_r1
1470              else
1471                buffer_i1 = zero
1472                do ipw=1,npw
1473                  buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,4+ffnl_dir(1),ilmn)
1474                end do
1475                d2gxdt(1,mu0,ilmn,ia,ispinor) =-scale*buffer_i1
1476              end if
1477            end if
1478          end do
1479        end if
1480 
1481 !      --------------------------------------------------------------------
1482 !      END CHOICES
1483 !      --------------------------------------------------------------------
1484 
1485      end do ! End loop on atoms
1486 
1487 !    Deallocate temporary space
1488      ABI_FREE(scali)
1489      ABI_FREE(scalr)
1490 
1491    end do !  End loop on spinorial components
1492 
1493 
1494 !  ==========================================================================
1495 !  ========== OPENMP VERSION ================================================
1496 !  ==========================================================================
1497 !  Parallelization OpenMP on npw loops
1498  else
1499 
1500 !$OMP PARALLEL PRIVATE(il,ilmn,ipw,jpw,parity,ndir,ffnl_dir), &
1501 !$OMP PRIVATE(mu,mua,mub,nua1,nua2,nub1,nub2), &
1502 !$OMP PRIVATE(kpga,kpgb,kpgc,kpgd), &
1503 !$OMP PRIVATE(scale,scale2,mu0), &
1504 !$OMP PRIVATE(ispinor,ipwshft,ia,iaph3d)
1505 
1506 !  Loop on spinorial components
1507    do ispinor =1,nspinor
1508      ipwshft=(ispinor-1)*npw
1509 
1510 !    Allocate work space
1511 !$OMP SECTIONS
1512 !$OMP SECTION
1513      ABI_MALLOC(scali,(npw))
1514 !$OMP SECTION
1515      ABI_MALLOC(scalr,(npw))
1516 !$OMP END SECTIONS
1517 
1518 !    Loop on atoms (blocking)
1519      do ia=1,nincat
1520        iaph3d=ia;if (nloalg(2)>0) iaph3d=ia+ia3-1
1521 
1522 !      Compute Sum_g[c(g).exp(2pi.i.g.R)]
1523 !$OMP DO
1524        do ipw=ipw0,npw
1525          jpw=ipw+ipwshft
1526          scalr(ipw)=(vect(1,jpw)*ph3d(1,ipw,iaph3d)-vect(2,jpw)*ph3d(2,ipw,iaph3d))
1527          scali(ipw)=(vect(2,jpw)*ph3d(1,ipw,iaph3d)+vect(1,jpw)*ph3d(2,ipw,iaph3d))
1528        end do
1529 !$OMP END DO
1530 !$OMP SINGLE
1531        if (ipw0==2) then
1532          scalr(1)=half*vect(1,1+ipwshft)*ph3d(1,1,iaph3d)
1533          scali(1)=half*vect(1,1+ipwshft)*ph3d(2,1,iaph3d)
1534        end if
1535 !$OMP END SINGLE
1536 
1537 !      --------------------------------------------------------------------
1538 !      ALL CHOICES
1539 !      Accumulate Gx
1540 !      --------------------------------------------------------------------
1541        if (choice>=0) then ! JWZ to check: I dont think 53 needs this
1542          do ilmn=1,nlmn
1543            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
1544            scale=wt;if (il>1) scale=-scale
1545            if (cplex==2) then
1546 !$OMP SINGLE
1547              buffer_r1 = zero ; buffer_i1 = zero
1548 !$OMP END SINGLE
1549 !$OMP DO &
1550 !$OMP REDUCTION(+:buffer_r1,buffer_i1)
1551              do ipw=1,npw
1552                buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1,ilmn)
1553                buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1,ilmn)
1554              end do
1555 !$OMP END DO
1556 !$OMP SINGLE
1557              if (parity) then
1558                gx(1,ilmn,ia,ispinor) = scale*buffer_r1 ; gx(2,ilmn,ia,ispinor) = scale*buffer_i1
1559              else
1560                gx(1,ilmn,ia,ispinor) =-scale*buffer_i1 ; gx(2,ilmn,ia,ispinor) = scale*buffer_r1
1561              end if
1562 !$OMP END SINGLE
1563            else
1564              if (parity) then
1565 !$OMP SINGLE
1566                buffer_r1 =  zero
1567 !$OMP END SINGLE
1568 !$OMP DO &
1569 !$OMP REDUCTION(+:buffer_r1)
1570                do ipw=1,npw
1571                  buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1,ilmn)
1572                end do
1573 !$OMP END DO
1574 !$OMP SINGLE
1575                gx(1,ilmn,ia,ispinor) = scale*buffer_r1
1576 !$OMP END SINGLE
1577              else
1578 !$OMP SINGLE
1579                buffer_i1 = zero
1580 !$OMP END SINGLE
1581 !$OMP DO &
1582 !$OMP REDUCTION(+:buffer_i1)
1583                do ipw=1,npw
1584                  buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1,ilmn)
1585                end do
1586 !$OMP END DO
1587 !$OMP SINGLE
1588                gx(1,ilmn,ia,ispinor) =-scale*buffer_i1
1589 !$OMP END SINGLE
1590              end if
1591            end if
1592          end do
1593        end if
1594 
1595 !      --------------------------------------------------------------------
1596 !      CHOICE= 2, 4, 6, 23, 24, 54  --  SIGNS= 1
1597 !      Accumulate dGxdt --- derivative wrt atm pos. --- for all directions
1598 !      --------------------------------------------------------------------
1599        if ((signs==1).and. &
1600 &       (choice_==2.or.choice_==23.or.choice_==24.or.choice_==4.or.choice_==54.or.choice_==6)) then
1601          mu0 =1;if (choice_==23.or.choice_==6) mu0=7
1602          do ilmn=1,nlmn
1603            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
1604            scale=wt;if (il>1) scale=-scale
1605            scale2=two_pi*scale
1606            if (cplex==2) then
1607 !$OMP SINGLE
1608              buffer_r1 = zero ; buffer_r2 = zero
1609              buffer_r3 = zero ; buffer_i1 = zero
1610              buffer_i2 = zero ; buffer_i3 = zero
1611 !$OMP END SINGLE
1612 !$OMP DO &
1613 !$OMP REDUCTION(+:buffer_r1,buffer_r2,buffer_r3,buffer_i1,buffer_i2,buffer_i3),&
1614 !$OMP PRIVATE(aux_r,aux_i)
1615              do ipw=1,npw
1616                aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
1617                aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
1618                buffer_r1 = buffer_r1 - aux_i*kpg(ipw,1)
1619                buffer_r2 = buffer_r2 - aux_i*kpg(ipw,2)
1620                buffer_r3 = buffer_r3 - aux_i*kpg(ipw,3)
1621                buffer_i1 = buffer_i1 + aux_r*kpg(ipw,1)
1622                buffer_i2 = buffer_i2 + aux_r*kpg(ipw,2)
1623                buffer_i3 = buffer_i3 + aux_r*kpg(ipw,3)
1624              end do
1625 !$OMP END DO
1626 !$OMP SINGLE
1627              if (parity) then
1628                dgxdt(1,mu0  ,ilmn,ia,ispinor) = scale2*buffer_r1
1629                dgxdt(2,mu0  ,ilmn,ia,ispinor) = scale2*buffer_i1
1630                dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale2*buffer_r2
1631                dgxdt(2,mu0+1,ilmn,ia,ispinor) = scale2*buffer_i2
1632                dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale2*buffer_r3
1633                dgxdt(2,mu0+2,ilmn,ia,ispinor) = scale2*buffer_i3
1634              else
1635                dgxdt(1,mu0  ,ilmn,ia,ispinor) =-scale2*buffer_i1
1636                dgxdt(2,mu0  ,ilmn,ia,ispinor) = scale2*buffer_r1
1637                dgxdt(1,mu0+1,ilmn,ia,ispinor) =-scale2*buffer_i2
1638                dgxdt(2,mu0+1,ilmn,ia,ispinor) = scale2*buffer_r2
1639                dgxdt(1,mu0+2,ilmn,ia,ispinor) =-scale2*buffer_i3
1640                dgxdt(2,mu0+2,ilmn,ia,ispinor) = scale2*buffer_r3
1641              end if
1642 !$OMP END SINGLE
1643            else
1644              if (parity) then
1645 !$OMP SINGLE
1646                buffer_r1 = zero ; buffer_r2 = zero ; buffer_r3 = zero
1647 !$OMP END SINGLE
1648 !$OMP DO &
1649 !$OMP REDUCTION(+:buffer_r1,buffer_r2,buffer_r3), &
1650 !$OMP PRIVATE(aux_r,aux_i)
1651                do ipw=1,npw
1652                  aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
1653                  aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
1654                  buffer_r1 = buffer_r1 - aux_i*kpg(ipw,1)
1655                  buffer_r2 = buffer_r2 - aux_i*kpg(ipw,2)
1656                  buffer_r3 = buffer_r3 - aux_i*kpg(ipw,3)
1657                end do
1658 !$OMP END DO
1659 !$OMP SINGLE
1660                dgxdt(1,mu0  ,ilmn,ia,ispinor) = scale2*buffer_r1
1661                dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale2*buffer_r2
1662                dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale2*buffer_r3
1663 !$OMP END SINGLE
1664              else
1665 !$OMP SINGLE
1666                buffer_i1 = zero ; buffer_i2 = zero ; buffer_i3 = zero
1667 !$OMP END SINGLE
1668 !$OMP DO &
1669 !$OMP REDUCTION(+:buffer_i1,buffer_i2,buffer_i3), &
1670 !$OMP PRIVATE(aux_r,aux_i)
1671                do ipw=1,npw
1672                  aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
1673                  aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
1674                  buffer_i1 = buffer_i1 + aux_r*kpg(ipw,1)
1675                  buffer_i2 = buffer_i2 + aux_r*kpg(ipw,2)
1676                  buffer_i3 = buffer_i3 + aux_r*kpg(ipw,3)
1677                end do
1678 !$OMP SINGLE
1679                dgxdt(1,mu0  ,ilmn,ia,ispinor) =-scale2*buffer_i1
1680                dgxdt(1,mu0+1,ilmn,ia,ispinor) =-scale2*buffer_i2
1681                dgxdt(1,mu0+2,ilmn,ia,ispinor) =-scale2*buffer_i3
1682 !$OMP END SINGLE
1683              end if
1684            end if
1685          end do
1686        end if
1687 
1688 !      --------------------------------------------------------------------
1689 !      CHOICE= 2  --  SIGNS= 2
1690 !      Accumulate dGxdt --- derivative wrt atm pos. --- for direction IDIR
1691 !      --------------------------------------------------------------------
1692        if ((signs==2).and.(choice_==2)) then
1693          mu0=1
1694          do ilmn=1,nlmn
1695            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
1696            scale=wt;if (il>1) scale=-scale
1697            scale2=two_pi*scale
1698            if (cplex==2) then
1699 !$OMP SINGLE
1700              buffer_r1 = zero ; buffer_i1 = zero
1701 !$OMP END SINGLE
1702 !$OMP DO &
1703 !$OMP REDUCTION(+:buffer_r1,buffer_i1), &
1704 !$OMP PRIVATE(aux_r,aux_i)
1705              do ipw=1,npw
1706                aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
1707                aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
1708                buffer_r1 = buffer_r1 - aux_i*kpg(ipw,idir)
1709                buffer_i1 = buffer_i1 + aux_r*kpg(ipw,idir)
1710              end do
1711 !$OMP END DO
1712 !$OMP SINGLE
1713              if (parity) then
1714                dgxdt(1,mu0,ilmn,ia,ispinor) = scale2*buffer_r1
1715                dgxdt(2,mu0,ilmn,ia,ispinor) = scale2*buffer_i1
1716              else
1717                dgxdt(1,mu0,ilmn,ia,ispinor) =-scale2*buffer_i1
1718                dgxdt(2,mu0,ilmn,ia,ispinor) = scale2*buffer_r1
1719              end if
1720 !$OMP END SINGLE
1721            else
1722              if (parity) then
1723 !$OMP SINGLE
1724                buffer_r1 = zero
1725 !$OMP END SINGLE
1726 !$OMP DO &
1727 !$OMP REDUCTION(+:buffer_r1)
1728                do ipw=1,npw
1729                  buffer_r1 = buffer_r1 - scali(ipw)*ffnl(ipw,1,ilmn)*kpg(ipw,idir)
1730                end do
1731 !$OMP END DO
1732 !$OMP SINGLE
1733                dgxdt(1,mu0,ilmn,ia,ispinor) = scale2*buffer_r1
1734 !$OMP END SINGLE
1735              else
1736 !$OMP SINGLE
1737                buffer_i1 = zero
1738 !$OMP END SINGLE
1739 !$OMP DO &
1740 !$OMP REDUCTION(+:buffer_i1)
1741                do ipw=1,npw
1742                  buffer_i1 = buffer_i1 + scalr(ipw)*ffnl(ipw,1,ilmn)*kpg(ipw,idir)
1743                end do
1744 !$OMP END DO
1745 !$OMP SINGLE
1746                dgxdt(1,mu0,ilmn,ia,ispinor) =-scale2*buffer_i1
1747 !$OMP END SINGLE
1748              end if
1749            end if
1750          end do
1751        end if
1752 
1753 !      --------------------------------------------------------------------
1754 !      CHOICE= 22 and 25  --  SIGNS= 2
1755 !      Accumulate dGxdt --- derivative wrt atm pos. and one or two q-vectors--- 
1756 !      for directions fixed by IDIR and qdir
1757 !      --------------------------------------------------------------------
1758        if (signs==2.and.(choice_==22.or.choice_==25)) then
1759          !Use same notation as the notes for clarity
1760          if(choice_==22) ialpha=idir
1761          if(choice_==25) ialpha=nalpha(idir)
1762          mu0=1
1763          do ilmn=1,nlmn
1764            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
1765            scale=wt;if (il>1) scale=-scale
1766            if (cplex==2) then
1767 !$OMP SINGLE
1768              buffer_r1 = zero ; buffer_i1 = zero
1769 !$OMP END SINGLE
1770 !$OMP DO &
1771 !$OMP REDUCTION(+:buffer_r1,buffer_i1), &
1772 !$OMP PRIVATE(aux_r,aux_i)
1773              do ipw=1,npw
1774                aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
1775                aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
1776                buffer_r1 = buffer_r1 + aux_r*kpg(ipw,ialpha)
1777                buffer_i1 = buffer_i1 + aux_i*kpg(ipw,ialpha)
1778              end do
1779 !$OMP END DO
1780 !$OMP SINGLE
1781              if (parity) then
1782                dgxdt(1,mu0,ilmn,ia,ispinor) = scale*buffer_r1
1783                dgxdt(2,mu0,ilmn,ia,ispinor) = scale*buffer_i1
1784              else
1785                dgxdt(1,mu0,ilmn,ia,ispinor) =-scale*buffer_i1
1786                dgxdt(2,mu0,ilmn,ia,ispinor) = scale*buffer_r1
1787              end if
1788 !$OMP END SINGLE
1789            else
1790              if (parity) then
1791 !$OMP SINGLE
1792                buffer_r1 = zero
1793 !$OMP END SINGLE
1794 !$OMP DO &
1795 !$OMP REDUCTION(+:buffer_r1)
1796                do ipw=1,npw
1797                  buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1,ilmn)*kpg(ipw,ialpha)
1798                end do
1799 !$OMP END DO
1800 !$OMP SINGLE
1801                dgxdt(1,mu0,ilmn,ia,ispinor) = scale*buffer_r1
1802 !$OMP END SINGLE
1803              else
1804 !$OMP SINGLE
1805                buffer_i1 = zero
1806 !$OMP END SINGLE
1807 !$OMP DO &
1808 !$OMP REDUCTION(+:buffer_i1)
1809                do ipw=1,npw
1810                  buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1,ilmn)*kpg(ipw,ialpha)
1811                end do
1812 !$OMP END DO
1813 !$OMP SINGLE
1814                dgxdt(1,mu0,ilmn,ia,ispinor) =-scale*buffer_i1
1815 !$OMP END SINGLE
1816              end if
1817            end if
1818          end do
1819        end if
1820 
1821 !      --------------------------------------------------------------------
1822 !      CHOICE= 3, 6, 23, 55  -- SIGNS= 1
1823 !      Accumulate dGxdt --- derivative wrt strain --- for all directions
1824 !      --------------------------------------------------------------------
1825        if ((signs==1).and.(choice_==3.or.choice_==6.or.choice_==23.or.choice_==55)) then
1826          mu0=1
1827          do ilmn=1,nlmn
1828            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
1829            scale=wt;if (il>1) scale=-scale
1830            scale2=half*scale
1831            if (cplex==2) then
1832 !$OMP SINGLE
1833              buffer_r1 = zero ; buffer_r2 = zero
1834              buffer_r3 = zero ; buffer_r4 = zero
1835              buffer_r5 = zero ; buffer_r6 = zero
1836              buffer_i1 = zero ; buffer_i2 = zero
1837              buffer_i3 = zero ; buffer_i4 = zero
1838              buffer_i5 = zero ; buffer_i6 = zero
1839 !$OMP END SINGLE
1840 !$OMP DO &
1841 !$OMP REDUCTION(+:buffer_r1,buffer_r2,buffer_r3,buffer_r4,buffer_r5,buffer_r6), &
1842 !$OMP REDUCTION(+:buffer_i1,buffer_i2,buffer_i3,buffer_i4,buffer_i5,buffer_i6), &
1843 !$OMP PRIVATE(aux_r2,aux_r3,aux_r4,aux_i2,aux_i3,aux_i4)
1844              do ipw=1,npw
1845                aux_r2 = scalr(ipw)*ffnl(ipw,2,ilmn)
1846                aux_r3 = scalr(ipw)*ffnl(ipw,3,ilmn)
1847                aux_r4 = scalr(ipw)*ffnl(ipw,4,ilmn)
1848                aux_i2 = scali(ipw)*ffnl(ipw,2,ilmn)
1849                aux_i3 = scali(ipw)*ffnl(ipw,3,ilmn)
1850                aux_i4 = scali(ipw)*ffnl(ipw,4,ilmn)
1851                buffer_r1 = buffer_r1 + aux_r2*kpg(ipw,1)
1852                buffer_r2 = buffer_r2 + aux_r3*kpg(ipw,2)
1853                buffer_r3 = buffer_r3 + aux_r4*kpg(ipw,3)
1854                buffer_r4 = buffer_r4 + aux_r4*kpg(ipw,2) + aux_r3*kpg(ipw,3)
1855                buffer_r5 = buffer_r5 + aux_r4*kpg(ipw,1) + aux_r2*kpg(ipw,3)
1856                buffer_r6 = buffer_r6 + aux_r3*kpg(ipw,1) + aux_r2*kpg(ipw,2)
1857                buffer_i1 = buffer_i1 + aux_i2*kpg(ipw,1)
1858                buffer_i2 = buffer_i2 + aux_i3*kpg(ipw,2)
1859                buffer_i3 = buffer_i3 + aux_i4*kpg(ipw,3)
1860                buffer_i4 = buffer_i4 + aux_i4*kpg(ipw,2) + aux_i3*kpg(ipw,3)
1861                buffer_i5 = buffer_i5 + aux_i4*kpg(ipw,1) + aux_i2*kpg(ipw,3)
1862                buffer_i6 = buffer_i6 + aux_i3*kpg(ipw,1) + aux_i2*kpg(ipw,2)
1863              end do
1864 !$OMP END DO
1865 !$OMP SINGLE
1866              if (parity) then
1867                dgxdt(1,mu0  ,ilmn,ia,ispinor) =-scale*buffer_r1
1868                dgxdt(2,mu0  ,ilmn,ia,ispinor) =-scale*buffer_i1
1869                dgxdt(1,mu0+1,ilmn,ia,ispinor) =-scale*buffer_r2
1870                dgxdt(2,mu0+1,ilmn,ia,ispinor) =-scale*buffer_i2
1871                dgxdt(1,mu0+2,ilmn,ia,ispinor) =-scale*buffer_r3
1872                dgxdt(2,mu0+2,ilmn,ia,ispinor) =-scale*buffer_i3
1873                dgxdt(1,mu0+3,ilmn,ia,ispinor) =-scale2*buffer_r4
1874                dgxdt(2,mu0+3,ilmn,ia,ispinor) =-scale2*buffer_i4
1875                dgxdt(1,mu0+4,ilmn,ia,ispinor) =-scale2*buffer_r5
1876                dgxdt(2,mu0+4,ilmn,ia,ispinor) =-scale2*buffer_i5
1877                dgxdt(1,mu0+5,ilmn,ia,ispinor) =-scale2*buffer_r6
1878                dgxdt(2,mu0+5,ilmn,ia,ispinor) =-scale2*buffer_i6
1879              else
1880                dgxdt(1,mu0  ,ilmn,ia,ispinor) = scale*buffer_i1
1881                dgxdt(2,mu0  ,ilmn,ia,ispinor) =-scale*buffer_r1
1882                dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_i2
1883                dgxdt(2,mu0+1,ilmn,ia,ispinor) =-scale*buffer_r2
1884                dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_i3
1885                dgxdt(2,mu0+2,ilmn,ia,ispinor) =-scale*buffer_r3
1886                dgxdt(1,mu0+3,ilmn,ia,ispinor) = scale2*buffer_i4
1887                dgxdt(2,mu0+3,ilmn,ia,ispinor) =-scale2*buffer_r4
1888                dgxdt(1,mu0+4,ilmn,ia,ispinor) = scale2*buffer_i5
1889                dgxdt(2,mu0+4,ilmn,ia,ispinor) =-scale2*buffer_r5
1890                dgxdt(1,mu0+5,ilmn,ia,ispinor) = scale2*buffer_i6
1891                dgxdt(2,mu0+5,ilmn,ia,ispinor) =-scale2*buffer_r6
1892              end if
1893 !$OMP END SINGLE
1894            else
1895              if (parity) then
1896 !$OMP SINGLE
1897                buffer_r1 = zero ; buffer_r2 = zero
1898                buffer_r3 = zero ; buffer_r4 = zero
1899                buffer_r5 = zero ; buffer_r6 = zero
1900 !$OMP END SINGLE
1901 !$OMP DO &
1902 !$OMP REDUCTION(+:buffer_r1,buffer_r2,buffer_r3,buffer_r4,buffer_r5,buffer_r6), &
1903 !$OMP PRIVATE(aux_r2,aux_r3,aux_r4)
1904                do ipw=1,npw
1905                  aux_r2 = scalr(ipw)*ffnl(ipw,2,ilmn)
1906                  aux_r3 = scalr(ipw)*ffnl(ipw,3,ilmn)
1907                  aux_r4 = scalr(ipw)*ffnl(ipw,4,ilmn)
1908                  buffer_r1 = buffer_r1 + aux_r2*kpg(ipw,1)
1909                  buffer_r2 = buffer_r2 + aux_r3*kpg(ipw,2)
1910                  buffer_r3 = buffer_r3 + aux_r4*kpg(ipw,3)
1911                  buffer_r4 = buffer_r4 + aux_r4*kpg(ipw,2) + aux_r3*kpg(ipw,3)
1912                  buffer_r5 = buffer_r5 + aux_r4*kpg(ipw,1) + aux_r2*kpg(ipw,3)
1913                  buffer_r6 = buffer_r6 + aux_r3*kpg(ipw,1) + aux_r2*kpg(ipw,2)
1914                end do
1915 !$OMP SINGLE
1916                dgxdt(1,mu0  ,ilmn,ia,ispinor) =-scale*buffer_r1
1917                dgxdt(1,mu0+1,ilmn,ia,ispinor) =-scale*buffer_r2
1918                dgxdt(1,mu0+2,ilmn,ia,ispinor) =-scale*buffer_r3
1919                dgxdt(1,mu0+3,ilmn,ia,ispinor) =-scale2*buffer_r4
1920                dgxdt(1,mu0+4,ilmn,ia,ispinor) =-scale2*buffer_r5
1921                dgxdt(1,mu0+5,ilmn,ia,ispinor) =-scale2*buffer_r6
1922 !$OMP END SINGLE
1923              else
1924 !$OMP SINGLE
1925                buffer_i1 = zero ; buffer_i2 = zero
1926                buffer_i3 = zero ; buffer_i4 = zero
1927                buffer_i5 = zero ; buffer_i6 = zero
1928 !$OMP END SINGLE
1929 !$OMP DO &
1930 !$OMP REDUCTION(+:buffer_i1,buffer_i2,buffer_i3,buffer_i4,buffer_i5,buffer_i6), &
1931 !$OMP PRIVATE(aux_i2,aux_i3,aux_i4)
1932                do ipw=1,npw
1933                  aux_i2 = scali(ipw)*ffnl(ipw,2,ilmn)
1934                  aux_i3 = scali(ipw)*ffnl(ipw,3,ilmn)
1935                  aux_i4 = scali(ipw)*ffnl(ipw,4,ilmn)
1936                  buffer_i1 = buffer_i1 + aux_i2*kpg(ipw,1)
1937                  buffer_i2 = buffer_i2 + aux_i3*kpg(ipw,2)
1938                  buffer_i3 = buffer_i3 + aux_i4*kpg(ipw,3)
1939                  buffer_i4 = buffer_i4 + aux_i4*kpg(ipw,2) + aux_i3*kpg(ipw,3)
1940                  buffer_i5 = buffer_i5 + aux_i4*kpg(ipw,1) + aux_i2*kpg(ipw,3)
1941                  buffer_i6 = buffer_i6 + aux_i3*kpg(ipw,1) + aux_i2*kpg(ipw,2)
1942                end do
1943 !$OMP END DO
1944 !$OMP SINGLE
1945                dgxdt(1,mu0  ,ilmn,ia,ispinor) = scale*buffer_i1
1946                dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_i2
1947                dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_i3
1948                dgxdt(1,mu0+3,ilmn,ia,ispinor) = scale2*buffer_i4
1949                dgxdt(1,mu0+4,ilmn,ia,ispinor) = scale2*buffer_i5
1950                dgxdt(1,mu0+5,ilmn,ia,ispinor) = scale2*buffer_i6
1951 !$OMP END SINGLE
1952              end if
1953            end if
1954          end do
1955        end if
1956 
1957 !      --------------------------------------------------------------------
1958 !      CHOICE= 3  --  SIGNS= 2
1959 !      Accumulate dGxdt --- derivative wrt strain --- for direction IDIR
1960 !      --------------------------------------------------------------------
1961        if ((signs==2).and.(choice_==3)) then
1962          mu0=1;ffnl_dir(1)=1;if(dimffnl>2) ffnl_dir(1)=idir
1963          do ilmn=1,nlmn
1964            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
1965            scale=wt;if (il>1) scale=-scale
1966            if (cplex==2) then
1967 !$OMP SINGLE
1968              buffer_r1 = zero ; buffer_i1 = zero
1969 !$OMP END SINGLE
1970 !$OMP DO &
1971 !$OMP REDUCTION(+:buffer_r1,buffer_i1)
1972              do ipw=1,npw
1973                buffer_r1 = buffer_r1 - scalr(ipw)*ffnl(ipw,1+ffnl_dir(1),ilmn)
1974                buffer_i1 = buffer_i1 - scali(ipw)*ffnl(ipw,1+ffnl_dir(1),ilmn)
1975              end do
1976 !$OMP END DO
1977 !$OMP SINGLE
1978              if (parity) then
1979                dgxdt(1,mu0,ilmn,ia,ispinor) = scale*buffer_r1
1980                dgxdt(2,mu0,ilmn,ia,ispinor) = scale*buffer_i1
1981              else
1982                dgxdt(1,mu0,ilmn,ia,ispinor) =-scale*buffer_i1
1983                dgxdt(2,mu0,ilmn,ia,ispinor) = scale*buffer_r1
1984              end if
1985 !$OMP END SINGLE
1986            else
1987              if (parity) then
1988 !$OMP SINGLE
1989                buffer_r1 = zero
1990 !$OMP END SINGLE
1991 !$OMP DO &
1992 !$OMP REDUCTION(+:buffer_r1)
1993                do ipw=1,npw
1994                  buffer_r1 = buffer_r1 - scalr(ipw)*ffnl(ipw,1+ffnl_dir(1),ilmn)
1995                end do
1996 !$OMP END DO
1997 !$OMP SINGLE
1998                dgxdt(1,mu0,ilmn,ia,ispinor) = scale*buffer_r1
1999 !$OMP END SINGLE
2000              else
2001 !$OMP SINGLE
2002                buffer_i1 = zero
2003 !$OMP END SINGLE
2004 !$OMP DO &
2005 !$OMP REDUCTION(+:buffer_i1)
2006                do ipw=1,npw
2007                  buffer_i1 = buffer_i1 - scali(ipw)*ffnl(ipw,1+ffnl_dir(1),ilmn)
2008                end do
2009 !$OMP END DO
2010 !$OMP SINGLE
2011                dgxdt(1,mu0,ilmn,ia,ispinor) =-scale*buffer_i1
2012 !$OMP END SINGLE
2013              end if
2014            end if
2015          end do
2016        end if
2017 
2018 !      --------------------------------------------------------------------
2019 !      CHOICE= 33  --  SIGNS= 2
2020 !      Accumulate dGxdt and d2Gxdt --- mixed derivative wrt strain and q-vector --- 
2021 !      for directions fixed by idir and qdir
2022 !      --------------------------------------------------------------------
2023        if ((signs==2).and.(choice_==33)) then
2024          !Use same notation as the notes for clarity
2025          ibeta=nalpha(idir)
2026          idelta=nbeta(idir)
2027          igamma=qdir
2028          idelgam=gamma(idelta,igamma)
2029          do ilmn=1,nlmn
2030            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
2031            scale=wt;if (il>1) scale=-scale
2032            if (cplex==2) then
2033 !$OMP SINGLE
2034              buffer_r1 = zero ; buffer_i1 = zero
2035              buffer_r2 = zero ; buffer_i2 = zero
2036              buffer_r3 = zero ; buffer_i3 = zero
2037              buffer_r4 = zero ; buffer_i4 = zero
2038              buffer_r5 = zero ; buffer_i5 = zero
2039 !$OMP END SINGLE
2040 !$OMP DO &
2041 !$OMP REDUCTION(+:buffer_r1,buffer_r2,buffer_r3,buffer_r4,buffer_r5), &
2042 !$OMP REDUCTION(+:buffer_i1,buffer_i2,buffer_i3,buffer_i4,buffer_i5), &
2043 !$OMP PRIVATE(aux_r,aux_i)
2044              do ipw=1,npw
2045                aux_r = scalr(ipw)*ffnl(ipw,1+igamma,ilmn)
2046                aux_i = scali(ipw)*ffnl(ipw,1+igamma,ilmn)
2047                buffer_r1 = buffer_r1 + aux_r
2048                buffer_i1 = buffer_i1 + aux_i
2049                buffer_r2 = buffer_r2 + aux_r*kpg(ipw,ibeta)
2050                buffer_i2 = buffer_i2 + aux_i*kpg(ipw,ibeta)
2051                aux_r = scalr(ipw)*ffnl(ipw,1+idelta,ilmn)
2052                aux_i = scali(ipw)*ffnl(ipw,1+idelta,ilmn)
2053                buffer_r3 = buffer_r3 + aux_r
2054                buffer_i3 = buffer_i3 + aux_i
2055                buffer_r4 = buffer_r4 + aux_r*kpg(ipw,ibeta)
2056                buffer_i4 = buffer_i4 + aux_i*kpg(ipw,ibeta)
2057                aux_r = scalr(ipw)*ffnl(ipw,4+idelgam,ilmn)
2058                aux_i = scali(ipw)*ffnl(ipw,4+idelgam,ilmn)
2059                buffer_r5 = buffer_r5 + aux_r*kpg(ipw,ibeta)
2060                buffer_i5 = buffer_i5 + aux_i*kpg(ipw,ibeta)
2061              end do
2062 !$OMP END DO
2063 !$OMP SINGLE
2064              if (parity) then
2065                dgxdt(1,1,ilmn,ia,ispinor) = scale*buffer_r1
2066                dgxdt(2,1,ilmn,ia,ispinor) = scale*buffer_i1
2067                dgxdt(1,2,ilmn,ia,ispinor) = scale*buffer_r3
2068                dgxdt(2,2,ilmn,ia,ispinor) = scale*buffer_i3
2069                d2gxdt(1,1,ilmn,ia,ispinor) = scale*buffer_r2
2070                d2gxdt(2,1,ilmn,ia,ispinor) = scale*buffer_i2
2071                d2gxdt(1,2,ilmn,ia,ispinor) = scale*buffer_r4
2072                d2gxdt(2,2,ilmn,ia,ispinor) = scale*buffer_i4
2073                d2gxdt(1,3,ilmn,ia,ispinor) = scale*buffer_r5
2074                d2gxdt(2,3,ilmn,ia,ispinor) = scale*buffer_i5
2075              else
2076                dgxdt(1,1,ilmn,ia,ispinor) =-scale*buffer_i1
2077                dgxdt(2,1,ilmn,ia,ispinor) = scale*buffer_r1
2078                dgxdt(1,2,ilmn,ia,ispinor) =-scale*buffer_i3
2079                dgxdt(2,2,ilmn,ia,ispinor) = scale*buffer_r3
2080                d2gxdt(1,1,ilmn,ia,ispinor) =-scale*buffer_i2
2081                d2gxdt(2,1,ilmn,ia,ispinor) = scale*buffer_r2
2082                d2gxdt(1,2,ilmn,ia,ispinor) =-scale*buffer_i4
2083                d2gxdt(2,2,ilmn,ia,ispinor) = scale*buffer_r4
2084                d2gxdt(1,3,ilmn,ia,ispinor) =-scale*buffer_i5
2085                d2gxdt(2,3,ilmn,ia,ispinor) = scale*buffer_r5
2086              end if
2087 !$OMP END SINGLE
2088            else
2089              if (parity) then
2090 !$OMP SINGLE
2091                buffer_r1 = zero
2092                buffer_r2 = zero
2093                buffer_r3 = zero
2094                buffer_r4 = zero
2095                buffer_r5 = zero
2096 !$OMP END SINGLE
2097 !$OMP DO &
2098 !$OMP REDUCTION(+:buffer_r1,buffer_r2,buffer_r3,buffer_r4,buffer_r5), &
2099 !$OMP PRIVATE(aux_r)
2100                do ipw=1,npw
2101                  aux_r = scalr(ipw)*ffnl(ipw,1+igamma,ilmn)
2102                  buffer_r1 = buffer_r1 + aux_r
2103                  buffer_r2 = buffer_r2 + aux_r*kpg(ipw,ibeta)
2104                  aux_r = scalr(ipw)*ffnl(ipw,1+idelta,ilmn)
2105                  buffer_r3 = buffer_r3 + aux_r
2106                  buffer_r4 = buffer_r4 + aux_r*kpg(ipw,ibeta)
2107                  aux_r = scalr(ipw)*ffnl(ipw,4+idelgam,ilmn)
2108                  buffer_r5 = buffer_r5 + aux_r*kpg(ipw,ibeta)
2109                end do
2110 !$OMP SINGLE
2111                dgxdt(1,1,ilmn,ia,ispinor) = scale*buffer_r1
2112                dgxdt(1,2,ilmn,ia,ispinor) = scale*buffer_r3
2113                d2gxdt(1,1,ilmn,ia,ispinor) = scale*buffer_r2
2114                d2gxdt(1,2,ilmn,ia,ispinor) = scale*buffer_r4
2115                d2gxdt(1,3,ilmn,ia,ispinor) = scale*buffer_r5
2116 !$OMP END SINGLE
2117              else
2118 !$OMP SINGLE
2119                buffer_i1 = zero
2120                buffer_i2 = zero
2121                buffer_i3 = zero
2122                buffer_i4 = zero
2123                buffer_i5 = zero
2124 !$OMP END SINGLE
2125 !$OMP DO &
2126 !$OMP REDUCTION(+:buffer_i1,buffer_i2,buffer_i3,buffer_i4,buffer_i5), &
2127 !$OMP PRIVATE(aux_i)
2128                do ipw=1,npw
2129                  aux_i = scali(ipw)*ffnl(ipw,1+igamma,ilmn)
2130                  buffer_i1 = buffer_i1 + aux_i
2131                  buffer_i2 = buffer_i2 + aux_i*kpg(ipw,ibeta)
2132                  aux_i = scali(ipw)*ffnl(ipw,1+idelta,ilmn)
2133                  buffer_i3 = buffer_i3 + aux_i
2134                  buffer_i4 = buffer_i4 + aux_i*kpg(ipw,ibeta)
2135                  aux_i = scali(ipw)*ffnl(ipw,4+idelgam,ilmn)
2136                  buffer_i5 = buffer_i5 + aux_i*kpg(ipw,ibeta)
2137                end do
2138 !$OMP END DO
2139 !$OMP SINGLE
2140                dgxdt(1,1,ilmn,ia,ispinor) =-scale*buffer_i1
2141                dgxdt(1,2,ilmn,ia,ispinor) =-scale*buffer_i3
2142                d2gxdt(1,1,ilmn,ia,ispinor) =-scale*buffer_i2
2143                d2gxdt(1,2,ilmn,ia,ispinor) =-scale*buffer_i4
2144                d2gxdt(1,3,ilmn,ia,ispinor) =-scale*buffer_i5
2145 !$OMP END SINGLE
2146              end if
2147            end if
2148          end do
2149        end if
2150 
2151 !      --------------------------------------------------------------------
2152 !      CHOICE= 4, 24  --  SIGNS= 1
2153 !      Accumulate d2Gxdt --- 2nd derivative wrt 2 atm pos. --- for all dirs
2154 !      --------------------------------------------------------------------
2155        if ((signs==1).and.(choice_==4.or.choice_==24)) then
2156          mu0=1
2157          do ilmn=1,nlmn
2158            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
2159            scale=wt;if (il>1) scale=-scale
2160            scale2=two_pi2*scale
2161            if (cplex==2) then
2162 !$OMP SINGLE
2163              buffer_ra = zero ; buffer_rb = zero
2164              buffer_rc = zero ; buffer_rd = zero
2165              buffer_re = zero ; buffer_rf = zero
2166              buffer_ia = zero ; buffer_ib = zero
2167              buffer_ic = zero ; buffer_id = zero
2168              buffer_ie = zero ; buffer_if = zero
2169 !$OMP END SINGLE
2170 !$OMP DO &
2171 !$OMP PRIVATE(aux_r,aux_i), &
2172 !$OMP REDUCTION(+:buffer_ra,buffer_rb,buffer_rc,buffer_rd,buffer_re,buffer_rf),&
2173 !$OMP REDUCTION(+:buffer_ia,buffer_ib,buffer_ic,buffer_id,buffer_ie,buffer_if)
2174              do ipw=1,npw
2175                aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
2176                aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
2177                buffer_ra = buffer_ra - aux_r*kpg(ipw,4)
2178                buffer_rb = buffer_rb - aux_r*kpg(ipw,5)
2179                buffer_rc = buffer_rc - aux_r*kpg(ipw,6)
2180                buffer_rd = buffer_rd - aux_r*kpg(ipw,7)
2181                buffer_re = buffer_re - aux_r*kpg(ipw,8)
2182                buffer_rf = buffer_rf - aux_r*kpg(ipw,9)
2183                buffer_ia = buffer_ia - aux_i*kpg(ipw,4)
2184                buffer_ib = buffer_ib - aux_i*kpg(ipw,5)
2185                buffer_ic = buffer_ic - aux_i*kpg(ipw,6)
2186                buffer_id = buffer_id - aux_i*kpg(ipw,7)
2187                buffer_ie = buffer_ie - aux_i*kpg(ipw,8)
2188                buffer_if = buffer_if - aux_i*kpg(ipw,9)
2189              end do
2190 !$OMP END DO
2191 !$OMP SINGLE
2192              if (parity) then
2193                d2gxdt(1,mu0  ,ilmn,ia,ispinor) = scale2*buffer_ra
2194                d2gxdt(2,mu0  ,ilmn,ia,ispinor) = scale2*buffer_ia
2195                d2gxdt(1,mu0+1,ilmn,ia,ispinor) = scale2*buffer_rb
2196                d2gxdt(2,mu0+1,ilmn,ia,ispinor) = scale2*buffer_ib
2197                d2gxdt(1,mu0+2,ilmn,ia,ispinor) = scale2*buffer_rc
2198                d2gxdt(2,mu0+2,ilmn,ia,ispinor) = scale2*buffer_ic
2199                d2gxdt(1,mu0+3,ilmn,ia,ispinor) = scale2*buffer_rd
2200                d2gxdt(2,mu0+3,ilmn,ia,ispinor) = scale2*buffer_id
2201                d2gxdt(1,mu0+4,ilmn,ia,ispinor) = scale2*buffer_re
2202                d2gxdt(2,mu0+4,ilmn,ia,ispinor) = scale2*buffer_ie
2203                d2gxdt(1,mu0+5,ilmn,ia,ispinor) = scale2*buffer_rf
2204                d2gxdt(2,mu0+5,ilmn,ia,ispinor) = scale2*buffer_if
2205              else
2206                d2gxdt(1,mu0  ,ilmn,ia,ispinor) =-scale2*buffer_ia
2207                d2gxdt(2,mu0  ,ilmn,ia,ispinor) = scale2*buffer_ra
2208                d2gxdt(1,mu0+1,ilmn,ia,ispinor) =-scale2*buffer_ib
2209                d2gxdt(2,mu0+1,ilmn,ia,ispinor) = scale2*buffer_rb
2210                d2gxdt(1,mu0+2,ilmn,ia,ispinor) =-scale2*buffer_ic
2211                d2gxdt(2,mu0+2,ilmn,ia,ispinor) = scale2*buffer_rc
2212                d2gxdt(1,mu0+3,ilmn,ia,ispinor) =-scale2*buffer_id
2213                d2gxdt(2,mu0+3,ilmn,ia,ispinor) = scale2*buffer_rd
2214                d2gxdt(1,mu0+4,ilmn,ia,ispinor) =-scale2*buffer_ie
2215                d2gxdt(2,mu0+4,ilmn,ia,ispinor) = scale2*buffer_re
2216                d2gxdt(1,mu0+5,ilmn,ia,ispinor) =-scale2*buffer_if
2217                d2gxdt(2,mu0+5,ilmn,ia,ispinor) = scale2*buffer_rf
2218              end if
2219 !$OMP END SINGLE
2220            else
2221              if (parity) then
2222 !$OMP SINGLE
2223                buffer_ra = zero ; buffer_rb = zero
2224                buffer_rc = zero ; buffer_rd = zero
2225                buffer_re = zero ; buffer_rf = zero
2226 !$OMP END SINGLE
2227 !$OMP DO &
2228 !$OMP PRIVATE(aux_r,aux_i), &
2229 !$OMP REDUCTION(+:buffer_ra,buffer_rb,buffer_rc,buffer_rd,buffer_re,buffer_rf)
2230                do ipw=1,npw
2231                  aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
2232                  aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
2233                  buffer_ra = buffer_ra - aux_r*kpg(ipw,4)
2234                  buffer_rb = buffer_rb - aux_r*kpg(ipw,5)
2235                  buffer_rc = buffer_rc - aux_r*kpg(ipw,6)
2236                  buffer_rd = buffer_rd - aux_r*kpg(ipw,7)
2237                  buffer_re = buffer_re - aux_r*kpg(ipw,8)
2238                  buffer_rf = buffer_rf - aux_r*kpg(ipw,9)
2239                end do
2240 !$OMP END DO
2241 !$OMP SINGLE
2242                d2gxdt(1,mu0  ,ilmn,ia,ispinor) = scale2*buffer_ra
2243                d2gxdt(1,mu0+1,ilmn,ia,ispinor) = scale2*buffer_rb
2244                d2gxdt(1,mu0+2,ilmn,ia,ispinor) = scale2*buffer_rc
2245                d2gxdt(1,mu0+3,ilmn,ia,ispinor) = scale2*buffer_rd
2246                d2gxdt(1,mu0+4,ilmn,ia,ispinor) = scale2*buffer_re
2247                d2gxdt(1,mu0+5,ilmn,ia,ispinor) = scale2*buffer_rf
2248 !$OMP END SINGLE
2249              else
2250 !$OMP SINGLE
2251                buffer_ia = zero ; buffer_ib = zero
2252                buffer_ic = zero ; buffer_id = zero
2253                buffer_ie = zero ; buffer_if = zero
2254 !$OMP END SINGLE
2255 !$OMP DO &
2256 !$OMP PRIVATE(aux_i,aux_r), &
2257 !$OMP REDUCTION(+:buffer_ia,buffer_ib,buffer_ic,buffer_id,buffer_ie,buffer_if)
2258                do ipw=1,npw
2259                  aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
2260                  aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
2261                  buffer_ia = buffer_ia - aux_i*kpg(ipw,4)
2262                  buffer_ib = buffer_ib - aux_i*kpg(ipw,5)
2263                  buffer_ic = buffer_ic - aux_i*kpg(ipw,6)
2264                  buffer_id = buffer_id - aux_i*kpg(ipw,7)
2265                  buffer_ie = buffer_ie - aux_i*kpg(ipw,8)
2266                  buffer_if = buffer_if - aux_i*kpg(ipw,9)
2267                end do
2268 !$OMP END DO
2269 !$OMP SINGLE
2270                d2gxdt(1,mu0  ,ilmn,ia,ispinor) =-scale2*buffer_ia
2271                d2gxdt(1,mu0+1,ilmn,ia,ispinor) =-scale2*buffer_ib
2272                d2gxdt(1,mu0+2,ilmn,ia,ispinor) =-scale2*buffer_ic
2273                d2gxdt(1,mu0+3,ilmn,ia,ispinor) =-scale2*buffer_id
2274                d2gxdt(1,mu0+4,ilmn,ia,ispinor) =-scale2*buffer_ie
2275                d2gxdt(1,mu0+5,ilmn,ia,ispinor) =-scale2*buffer_if
2276 !$OMP END SINGLE
2277              end if
2278            end if
2279          end do
2280        end if
2281 
2282 !      --------------------------------------------------------------------
2283 !      CHOICE= 5, 51, 52, 53, 54, 55, 8, 81  --  SIGNS= 1
2284 !      Accumulate dGxdt --- derivative wrt k --- for all directions
2285 !      --------------------------------------------------------------------
2286        if ((signs==1).and.&
2287 &       (choice_==5 .or.choice_==51.or.choice_==52.or.choice_==53.or.&
2288 &       choice_==54.or.choice_==55.or.choice_==8 .or.choice_==81)) then
2289          mu0=1
2290          if (choice_==54) mu0=4
2291          if (choice_==55) mu0=7
2292          do ilmn=1,nlmn
2293            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
2294            scale=wt;if (il>1) scale=-scale
2295            if (cplex==2) then
2296 !$OMP SINGLE
2297              buffer_r1 = zero ; buffer_r2 = zero
2298              buffer_r3 = zero
2299              buffer_i1 = zero ; buffer_i2 = zero
2300              buffer_i3 = zero
2301 !$OMP END SINGLE
2302 !$OMP DO &
2303 !$OMP REDUCTION(+:buffer_r1,buffer_r2,buffer_r3), &
2304 !$OMP REDUCTION(+:buffer_i1,buffer_i2,buffer_i3)
2305              do ipw=1,npw
2306                buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,2,ilmn)
2307                buffer_r2 = buffer_r2 + scalr(ipw)*ffnl(ipw,3,ilmn)
2308                buffer_r3 = buffer_r3 + scalr(ipw)*ffnl(ipw,4,ilmn)
2309                buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,2,ilmn)
2310                buffer_i2 = buffer_i2 + scali(ipw)*ffnl(ipw,3,ilmn)
2311                buffer_i3 = buffer_i3 + scali(ipw)*ffnl(ipw,4,ilmn)
2312              end do
2313 !$OMP END DO
2314 !$OMP SINGLE
2315              if (parity) then
2316                dgxdt(1,mu0  ,ilmn,ia,ispinor) = scale*buffer_r1
2317                dgxdt(2,mu0  ,ilmn,ia,ispinor) = scale*buffer_i1
2318                dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_r2
2319                dgxdt(2,mu0+1,ilmn,ia,ispinor) = scale*buffer_i2
2320                dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_r3
2321                dgxdt(2,mu0+2,ilmn,ia,ispinor) = scale*buffer_i3
2322              else
2323                dgxdt(1,mu0  ,ilmn,ia,ispinor) =-scale*buffer_i1
2324                dgxdt(2,mu0  ,ilmn,ia,ispinor) = scale*buffer_r1
2325                dgxdt(1,mu0+1,ilmn,ia,ispinor) =-scale*buffer_i2
2326                dgxdt(2,mu0+1,ilmn,ia,ispinor) = scale*buffer_r2
2327                dgxdt(1,mu0+2,ilmn,ia,ispinor) =-scale*buffer_i3
2328                dgxdt(2,mu0+2,ilmn,ia,ispinor) = scale*buffer_r3
2329              end if
2330 !$OMP END SINGLE
2331            else
2332              cplex_dgxdt(mu0:mu0+2) = 2 ! Warning dgxdt is here pure imaginary
2333              if (parity) then
2334 !$OMP SINGLE
2335                buffer_i1 = zero ; buffer_i2 = zero
2336                buffer_i3 = zero
2337 !$OMP END SINGLE
2338 !$OMP DO &
2339 !$OMP REDUCTION(+:buffer_i1,buffer_i2,buffer_i3)
2340                do ipw=1,npw
2341                  buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,2,ilmn)
2342                  buffer_i2 = buffer_i2 + scali(ipw)*ffnl(ipw,3,ilmn)
2343                  buffer_i3 = buffer_i3 + scali(ipw)*ffnl(ipw,4,ilmn)
2344                end do
2345 !$OMP END DO
2346 !$OMP SINGLE
2347                dgxdt(1,mu0  ,ilmn,ia,ispinor) = scale*buffer_i1
2348                dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_i2
2349                dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_i3
2350 !$OMP END SINGLE
2351              else
2352 !$OMP SINGLE
2353                buffer_r1 = zero ; buffer_r2 = zero
2354                buffer_r3 = zero
2355 !$OMP END SINGLE
2356 !$OMP DO &
2357 !$OMP REDUCTION(+:buffer_r1,buffer_r2,buffer_r3)
2358                do ipw=1,npw
2359                  buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,2,ilmn)
2360                  buffer_r2 = buffer_r2 + scalr(ipw)*ffnl(ipw,3,ilmn)
2361                  buffer_r3 = buffer_r3 + scalr(ipw)*ffnl(ipw,4,ilmn)
2362                end do
2363 !$OMP END DO
2364 !$OMP SINGLE
2365                dgxdt(1,mu0  ,ilmn,ia,ispinor) = scale*buffer_r1
2366                dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_r2
2367                dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_r3
2368 !$OMP END SINGLE
2369              end if
2370            end if
2371          end do
2372        end if
2373 
2374 !      --------------------------------------------------------------------
2375 !      CHOICE= 5, 51, 52, 53, 54, 8, 81  --  SIGNS= 2
2376 !      Accumulate dGxdt --- derivative wrt k ---
2377 !                            for direction IDIR (CHOICE=5,51,52)
2378 !                            for direction IDIR2 (CHOICE=54,81)
2379 !                            for directions IDIR-1 & IDIR+1 (CHOICE=53)
2380 !                            for 2 directions (CHOICE=8)
2381 !      --------------------------------------------------------------------
2382        if ((signs==2).and.&
2383 &       (choice_==5.or.choice_==51.or.choice_==52.or.choice_==53.or.choice_==54.or. &
2384 &       choice_==8.or.choice_==81)) then
2385          mu0=1
2386          if (choice_==5.or.choice_==51.or.choice_==52) then
2387 !          We compute the derivative in one direction
2388            ffnl_dir(1)=1;if(dimffnl>2) ffnl_dir(1)=idir
2389            ndir=1
2390          end if
2391          if (choice_==53) then
2392 !          Case 53 though need multiple directions and here ffnl will contain the
2393 !          derivative information in locations 2,3, and 4 corresponding to idir = 1, 2,
2394 !          and 3. Moreover, choice 53 needs the derivatives in direction idir+1 and idir-1.
2395 !          The parameter vector ffnl_dir_dat contains the necessary translations in
2396 !          locations 1,2 for idir=1; 3,4 for idir=2; and 5,6 for idir=3.
2397            ffnl_dir(1)=ffnl_dir_dat(2*idir-1);ffnl_dir(2)=ffnl_dir_dat(2*idir)
2398            ndir=2
2399          end if
2400          if (choice_==54) then
2401 !          We compute the derivative in one direction (the second one)
2402            ffnl_dir(1)=1;if(dimffnl>2) ffnl_dir(1)=idir2(idir)
2403            ndir=1
2404          end if
2405          if (choice_==8) then
2406 !          We compute the derivative in two directions
2407 !          depending on the input idir argument
2408            ffnl_dir(1)=idir1(idir);ffnl_dir(2)=idir2(idir)
2409            ndir=2
2410          end if
2411          if (choice_==81) then
2412 !          We compute the derivative in one direction (the second one)
2413            ffnl_dir(1)=idir2(idir)
2414            ndir=1
2415          end if
2416          do mua=1,ndir
2417            mu=mu0+mua-1
2418            do ilmn=1,nlmn
2419              il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
2420              scale=wt;if (il>1) scale=-scale
2421              if (cplex==2) then
2422 !$OMP SINGLE
2423                buffer_r1 = zero ; buffer_i1 = zero
2424 !$OMP END SINGLE
2425 !$OMP DO &
2426 !$OMP REDUCTION(+:buffer_r1,buffer_i1)
2427                do ipw=1,npw
2428                  buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1+ffnl_dir(mua),ilmn)
2429                  buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1+ffnl_dir(mua),ilmn)
2430                end do
2431 !$OMP END DO
2432 !$OMP SINGLE
2433                if (parity) then
2434                  dgxdt(1,mu,ilmn,ia,ispinor) = scale*buffer_r1
2435                  dgxdt(2,mu,ilmn,ia,ispinor) = scale*buffer_i1
2436                else
2437                  dgxdt(1,mu,ilmn,ia,ispinor) =-scale*buffer_i1
2438                  dgxdt(2,mu,ilmn,ia,ispinor) = scale*buffer_r1
2439                end if
2440 !$OMP END SINGLE
2441              else
2442 !$OMP SINGLE
2443                cplex_dgxdt(mu) = 2 ! Warning dgxdt is here pure imaginary
2444 !$OMP END SINGLE
2445                if (parity) then
2446 !$OMP SINGLE
2447                  buffer_i1 = zero
2448 !$OMP END SINGLE
2449 !$OMP DO &
2450 !$OMP REDUCTION(+:buffer_i1)
2451                  do ipw=1,npw
2452                    buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1+ffnl_dir(mua),ilmn)
2453                  end do
2454 !$OMP END DO
2455 !$OMP SINGLE
2456                  dgxdt(1,mu,ilmn,ia,ispinor) = scale*buffer_i1
2457 !$OMP END SINGLE
2458                else
2459 !$OMP SINGLE
2460                  buffer_r1 = zero
2461 !$OMP END SINGLE
2462 !$OMP DO &
2463 !$OMP REDUCTION(+:buffer_r1)
2464                  do ipw=1,npw
2465                    buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1+ffnl_dir(mua),ilmn)
2466                  end do
2467 !$OMP SINGLE
2468                  dgxdt(1,mu,ilmn,ia,ispinor) = scale*buffer_r1
2469 !$OMP END SINGLE
2470                end if
2471              end if
2472            end do
2473          end do
2474        end if
2475 
2476 !      --------------------------------------------------------------------
2477 !      CHOICE= 54  --  SIGNS= 1
2478 !      Accumulate d2Gxdt --- 2nd derivative wrt k and atm. pos --- in all dirs
2479 !      --------------------------------------------------------------------
2480        if ((signs==1).and.(choice_==54)) then
2481          mu0=1
2482          do ilmn=1,nlmn
2483            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
2484            scale=wt;if (il>1) scale=-scale
2485            scale2=two_pi*scale
2486            if (cplex==2) then
2487              do mua=1,3 ! atm. pos
2488                do mub=1,3 ! k
2489                  mu=mu0+(mub-1)+3*(mua-1)
2490 !$OMP SINGLE
2491                  buffer_r1 = zero ; buffer_i1 = zero
2492 !$OMP END SINGLE
2493 !$OMP DO &
2494 !$OMP REDUCTION(+:buffer_r1,buffer_i1)
2495                  do ipw=1,npw
2496                    buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
2497                    buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
2498                  end do
2499 !$OMP END DO
2500 !$OMP SINGLE
2501                  if (parity) then
2502                    d2gxdt(1,mu,ilmn,ia,ispinor) =-scale2*buffer_i1
2503                    d2gxdt(2,mu,ilmn,ia,ispinor) = scale2*buffer_r1
2504                  else
2505                    d2gxdt(1,mu,ilmn,ia,ispinor) =-scale2*buffer_r1
2506                    d2gxdt(2,mu,ilmn,ia,ispinor) =-scale2*buffer_i1
2507                  end if
2508 !$OMP END SINGLE
2509                end do
2510              end do
2511            else
2512 !$OMP SINGLE
2513              cplex_d2gxdt(mu0:mu0+8) = 2 ! Warning dgxdt is here pure imaginary
2514 !$OMP END SINGLE
2515              if (parity) then
2516                do mua=1,3 ! atm. pos
2517                  do mub=1,3 ! k
2518                    mu=mu0+(mub-1)+3*(mua-1)
2519 !$OMP SINGLE
2520                    buffer_r1 = zero
2521 !$OMP END SINGLE
2522 !$OMP DO &
2523 !$OMP REDUCTION(+:buffer_r1)
2524                    do ipw=1,npw
2525                      buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
2526                    end do
2527 !$OMP END DO
2528 !$OMP SINGLE
2529                    d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_r1
2530 !$OMP END SINGLE
2531                  end do
2532                end do
2533              else
2534                do mua=1,3 ! atm. pos
2535                  do mub=1,3 ! k
2536                    mu=mu0+(mub-1)+3*(mua-1)
2537 !$OMP SINGLE
2538                    buffer_i1 = zero
2539 !$OMP END SINGLE
2540 !$OMP DO &
2541 !$OMP REDUCTION(+:buffer_i1)
2542                    do ipw=1,npw
2543                      buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
2544                    end do
2545 !$OMP END DO
2546 !$OMP SINGLE
2547                    d2gxdt(1,mu,ilmn,ia,ispinor) = -scale2*buffer_i1
2548 !$OMP END SINGLE
2549                  end do
2550                end do
2551              end if
2552            end if
2553          end do
2554        end if
2555 
2556 !      --------------------------------------------------------------------
2557 !      CHOICE= 54  --  SIGNS= 2
2558 !      Accumulate d2Gxdt --- 2nd derivative wrt k and atm. pos --- for direction IDIR
2559 !      --------------------------------------------------------------------
2560        if ((signs==2).and.(choice_==54)) then
2561          mu0=1
2562          !idir= (xx=1, xy=2, xz=3, yx=4, yy=5, yz=6, zx=7, zy=8, zz=9)
2563          mua=idir1(idir) ! atm. pos
2564          mub=1;if(dimffnl>2) mub=idir2(idir) ! k
2565          do ilmn=1,nlmn
2566            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
2567            scale=wt;if (il>1) scale=-scale
2568            scale2=two_pi*scale
2569            if (cplex==2) then
2570 !$OMP SINGLE
2571              buffer_r1 = zero ; buffer_i1 = zero
2572 !$OMP END SINGLE
2573 !$OMP DO &
2574 !$OMP REDUCTION(+:buffer_r1,buffer_i1)
2575              do ipw=1,npw
2576                buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
2577                buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
2578              end do
2579 !$OMP END DO
2580 !$OMP SINGLE
2581              if (parity) then
2582                d2gxdt(1,mu0,ilmn,ia,ispinor) =-scale2*buffer_i1
2583                d2gxdt(2,mu0,ilmn,ia,ispinor) = scale2*buffer_r1
2584              else
2585                d2gxdt(1,mu0,ilmn,ia,ispinor) =-scale2*buffer_r1
2586                d2gxdt(2,mu0,ilmn,ia,ispinor) =-scale2*buffer_i1
2587              end if
2588 !$OMP END SINGLE
2589            else
2590              cplex_d2gxdt(mu0) = 2 ! Warning d2gxdt is here pure imaginary
2591              if (parity) then
2592 !$OMP SINGLE
2593                buffer_r1 = zero
2594 !$OMP END SINGLE
2595 !$OMP DO &
2596 !$OMP REDUCTION(+:buffer_r1)
2597                do ipw=1,npw
2598                  buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
2599                end do
2600 !$OMP END DO
2601 !$OMP SINGLE
2602                d2gxdt(1,mu0,ilmn,ia,ispinor) = scale*buffer_r1
2603 !$OMP END SINGLE
2604              else
2605 !$OMP SINGLE
2606                buffer_i1 = zero
2607 !$OMP END SINGLE
2608 !$OMP DO &
2609 !$OMP REDUCTION(+:buffer_i1)
2610                do ipw=1,npw
2611                  buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
2612                end do
2613 !$OMP SINGLE
2614                d2gxdt(1,mu0,ilmn,ia,ispinor) =-scale*buffer_i1
2615 !$OMP END SINGLE
2616              end if
2617            end if
2618          end do
2619        end if
2620 
2621 !      --------------------------------------------------------------------
2622 !      CHOICE= 55  --  SIGNS= 1
2623 !      Accumulate d2Gxdt --- 2nd derivative wrt k and strains --- for all dirs
2624 !      --------------------------------------------------------------------
2625        if ((signs==1).and.(choice_==55)) then
2626          mu0=1
2627          do ilmn=1,nlmn
2628            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
2629            scale=wt;if (il>1) scale=-scale
2630            if (cplex==2) then
2631              do mua=1,6 ! strain
2632                do mub=1,3 ! k
2633                  mu=mu0+(mub-1)+3*(mua-1)
2634 !$OMP SINGLE
2635                  buffer_r1 = zero ; buffer_i1 = zero
2636 !$OMP END SINGLE
2637 !$OMP DO &
2638 !$OMP REDUCTION(+:buffer_r1,buffer_i1),&
2639 !$OMP PRIVATE(aux_r)
2640                  do ipw=1,npw
2641                    aux_r=ffnl(ipw,4+mua ,ilmn)*kpg(ipw,mub)
2642                    buffer_r1 = buffer_r1 + aux_r*scalr(ipw)
2643                    buffer_i1 = buffer_i1 + aux_r*scali(ipw)
2644                  end do
2645 !$OMP END DO
2646 !$OMP SINGLE
2647                  if (parity) then
2648                    d2gxdt(1,mu,ilmn,ia,ispinor) =-scale*buffer_r1
2649                    d2gxdt(2,mu,ilmn,ia,ispinor) =-scale*buffer_i1
2650                  else
2651                    d2gxdt(1,mu,ilmn,ia,ispinor) = scale*buffer_i1
2652                    d2gxdt(2,mu,ilmn,ia,ispinor) =-scale*buffer_r1
2653                  end if
2654 !$OMP END SINGLE
2655                end do
2656              end do
2657            else
2658 !$OMP SINGLE
2659              cplex_d2gxdt(mu0:mu0+17) = 2 ! Warning d2gxdt is here pure imaginary
2660 !$OMP END SINGLE
2661              if (parity) then
2662                do mua=1,6 ! strain
2663                  do mub=1,3 ! k
2664                    mu=mu0+(mub-1)+3*(mua-1)
2665 !$OMP SINGLE
2666                    buffer_i1 = zero
2667 !$OMP END SINGLE
2668 !$OMP DO &
2669 !$OMP REDUCTION(+:buffer_i1)
2670                    do ipw=1,npw
2671                      buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,4+mua ,ilmn)*kpg(ipw,mub)
2672                    end do
2673 !$OMP END DO
2674 !$OMP SINGLE
2675                    d2gxdt(1,mu,ilmn,ia,ispinor) =-scale*buffer_i1
2676 !$OMP END SINGLE
2677                  end do
2678                end do
2679              else
2680                do mua=1,6 ! strain
2681                  do mub=1,3 ! k
2682                    mu=mu0+(mub-1)+3*(mua-1)
2683 !$OMP SINGLE
2684                    buffer_r1 = zero
2685 !$OMP END SINGLE
2686 !$OMP DO &
2687 !$OMP REDUCTION(+:buffer_r1)
2688                    do ipw=1,npw
2689                      buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,4+mua ,ilmn)*kpg(ipw,mub)
2690                    end do
2691 !$OMP END DO
2692 !$OMP SINGLE
2693                    d2gxdt(1,mu,ilmn,ia,ispinor) =-scale*buffer_r1
2694 !$OMP END SINGLE
2695                  end do
2696                end do
2697              end if
2698            end if
2699          end do
2700        end if
2701 
2702 !      --------------------------------------------------------------------
2703 !      CHOICE= 6  --  SIGNS= 1
2704 !      Accumulate d2Gxdt --- 2nd derivative wrt atm. pos and strain --- for all dirs
2705 !        --------------------------------------------------------------------
2706        if ((signs==1).and.(choice_==6)) then
2707          mu0=1;if (choice_==6) mu0=37
2708          ABI_MALLOC(scalarr,(npw,4))
2709          ABI_MALLOC(scalari,(npw,4))
2710          do ilmn=1,nlmn
2711            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
2712            scale=wt;if (il>1) scale=-scale
2713            scale2=pi*scale
2714            do mu=1,4
2715 !$OMP SINGLE
2716              do ipw=1,npw
2717                scalarr(ipw,mu)=scalr(ipw)*ffnl(ipw,mu,ilmn)
2718                scalari(ipw,mu)=scali(ipw)*ffnl(ipw,mu,ilmn)
2719              end do
2720 !$OMP END SINGLE
2721            end do
2722            if(cplex==2) then
2723              do mub=1,6
2724                nub1=alpha(mub);nub2=beta(mub)
2725                do mua=1,3
2726                  mu=mu0+(mua-1)+3*(mub-1)
2727                  buffer_r1 = zero ; buffer_i1 = zero
2728 !$OMP DO &
2729 !$OMP REDUCTION(+:buffer_r1,buffer_i1)
2730                  do ipw=1,npw
2731                    buffer_i1 = buffer_i1 + kpg(ipw,mua)*(scalari(ipw,1+nub1)*kpg(ipw,nub2) + &
2732 &                   scalari(ipw,1+nub2)*kpg(ipw,nub1))
2733                    buffer_r1 = buffer_r1 + kpg(ipw,mua)*(scalarr(ipw,1+nub1)*kpg(ipw,nub2) + &
2734 &                   scalarr(ipw,1+nub2)*kpg(ipw,nub1))
2735                  end do
2736 !$OMP END DO
2737                  if (parity) then
2738 !$OMP SINGLE
2739                    d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_i1
2740                    d2gxdt(2,mu,ilmn,ia,ispinor) =-scale2*buffer_r1
2741 !$OMP END SINGLE
2742                  else
2743 !$OMP SINGLE
2744                    d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_r1
2745                    d2gxdt(2,mu,ilmn,ia,ispinor) = scale2*buffer_i1
2746 !$OMP END SINGLE
2747                  end if
2748                end do
2749              end do
2750            else
2751              if (parity) then
2752                do mub=1,6
2753                  nub1=alpha(mub);nub2=beta(mub)
2754                  do mua=1,3
2755                    mu=mu0+(mua-1)+3*(mub-1)
2756                    buffer_i1 = zero
2757 !$OMP DO &
2758 !$OMP REDUCTION(+:buffer_r1)
2759                    do ipw=1,npw
2760                      buffer_i1 = buffer_i1 + kpg(ipw,mua)*(scalari(ipw,1+nub1)*kpg(ipw,nub2) + &
2761 &                     scalari(ipw,1+nub2)*kpg(ipw,nub1))
2762                    end do
2763 !$OMP END DO
2764 !$OMP SINGLE
2765                    d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_i1
2766 !$OMP END SINGLE
2767                  end do
2768                end do
2769              else
2770                do mub=1,6
2771                  nub1=alpha(mub);nub2=beta(mub)
2772                  do mua=1,3
2773                    mu=mu0+(mua-1)+3*(mub-1)
2774                    buffer_r1 = zero
2775 !$OMP DO &
2776 !$OMP REDUCTION(+:buffer_r1)
2777                    do ipw=1,npw
2778                      buffer_r1 = buffer_r1 + kpg(ipw,mua)*(scalarr(ipw,1+nub1)*kpg(ipw,nub2) + &
2779 &                     scalarr(ipw,1+nub2)*kpg(ipw,nub1))
2780                    end do
2781 !$OMP END DO
2782 !$OMP SINGLE
2783                    d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_r1
2784 !$OMP END SINGLE
2785                  end do
2786                end do
2787              end if
2788            end if
2789          end do
2790          ABI_FREE(scalarr)
2791          ABI_FREE(scalari)
2792        end if
2793 
2794 !      --------------------------------------------------------------------
2795 !      CHOICE= 6  --  SIGNS= 1
2796 !      Accumulate d2Gxdt --- 2nd derivative wrt 2 strains --- for all dirs
2797 !        --------------------------------------------------------------------
2798        if ((signs==1).and.(choice_==6)) then
2799          mu0=1
2800          ABI_MALLOC(scalarr,(npw,10))
2801          ABI_MALLOC(scalari,(npw,10))
2802          do ilmn=1,nlmn
2803            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
2804            scale=wt;if (il>1) scale=-scale
2805            scale2=quarter*scale
2806            do mu=1,10
2807 !$OMP SINGLE
2808              do ipw=1,npw
2809                scalarr(ipw,mu)=scalr(ipw)*ffnl(ipw,mu,ilmn)
2810                scalari(ipw,mu)=scali(ipw)*ffnl(ipw,mu,ilmn)
2811              end do
2812 !$OMP END SINGLE
2813            end do
2814            if(cplex==2) then
2815              do mub=1,6
2816                nub1=alpha(mub);nub2=beta(mub)
2817                do mua=1,6
2818                  mu=mu0+(mua-1)+6*(mub-1)
2819                  nua1=alpha(mua);nua2=beta(mua)
2820                  gama=gamma(nub1,nua1)
2821                  gamb=gamma(nub2,nua1)
2822                  gamc=gamma(nub1,nua2)
2823                  gamd=gamma(nub2,nua2)
2824                  buffer_r1 = zero ; buffer_i1 = zero
2825 !$OMP DO &
2826 !$OMP REDUCTION(+:buffer_r1,buffer_i1), &
2827 !$OMP PRIVATE(kpga,kpgb,kpgc,kpgd)
2828                  do ipw=1,npw
2829                    kpga=kpg(ipw,nub1)
2830                    kpgb=kpg(ipw,nub2)
2831                    kpgc=kpg(ipw,nua1)
2832                    kpgd=kpg(ipw,nua2)
2833                    buffer_r1 = buffer_r1 + scalarr(ipw,4+gama)*kpgb*kpgd+scalarr(ipw,4+gamb)*kpga*kpgd &
2834 &                   + scalarr(ipw,4+gamc)*kpgb*kpgc+scalarr(ipw,4+gamd)*kpga*kpgc
2835                    buffer_i1 = buffer_i1 + scalari(ipw,4+gama)*kpgb*kpgd+scalari(ipw,4+gamb)*kpga*kpgd &
2836 &                   + scalari(ipw,4+gamc)*kpgb*kpgc+scalari(ipw,4+gamd)*kpga*kpgc
2837                  end do
2838 !$OMP END DO
2839                  if (parity) then
2840 !$OMP SINGLE
2841                    d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_r1
2842                    d2gxdt(2,mu,ilmn,ia,ispinor) = scale2*buffer_i1
2843 !$OMP END SINGLE
2844                  else
2845 !$OMP SINGLE
2846                    d2gxdt(1,mu,ilmn,ia,ispinor) =-scale2*buffer_i1
2847                    d2gxdt(2,mu,ilmn,ia,ispinor) = scale2*buffer_r1
2848 !$OMP END SINGLE
2849                  end if
2850                end do
2851              end do
2852            else
2853              if (parity) then
2854                do mub=1,6
2855                  nub1=alpha(mub);nub2=beta(mub)
2856                  do mua=1,6
2857                    mu=mu0+(mua-1)+6*(mub-1)
2858                    nua1=alpha(mua);nua2=beta(mua)
2859                    gama=gamma(nub1,nua1)
2860                    gamb=gamma(nub2,nua1)
2861                    gamc=gamma(nub1,nua2)
2862                    gamd=gamma(nub2,nua2)
2863                    buffer_r1 = zero
2864 !$OMP DO &
2865 !$OMP REDUCTION(+:buffer_r1), &
2866 !$OMP PRIVATE(kpga,kpgb,kpgc,kpgd)
2867                    do ipw=1,npw
2868                      kpga=kpg(ipw,nub1)
2869                      kpgb=kpg(ipw,nub2)
2870                      kpgc=kpg(ipw,nua1)
2871                      kpgd=kpg(ipw,nua2)
2872                      buffer_r1 = buffer_r1 + scalarr(ipw,4+gama)*kpgb*kpgd+scalarr(ipw,4+gamb)*kpga*kpgd &
2873 &                     + scalarr(ipw,4+gamc)*kpgb*kpgc+scalarr(ipw,4+gamd)*kpga*kpgc
2874                    end do
2875 !$OMP END DO
2876 !$OMP SINGLE
2877                    d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_r1
2878 !$OMP END SINGLE
2879                  end do
2880                end do
2881              else
2882                do mub=1,6
2883                  nub1=alpha(mub);nub2=beta(mub)
2884                  do mua=1,6
2885                    mu=mu0+(mua-1)+6*(mub-1)
2886                    nua1=alpha(mua);nua2=beta(mua)
2887                    gama=gamma(nub1,nua1)
2888                    gamb=gamma(nub2,nua1)
2889                    gamc=gamma(nub1,nua2)
2890                    gamd=gamma(nub2,nua2)
2891                    buffer_i1 = zero
2892 !$OMP DO &
2893 !$OMP REDUCTION(+:buffer_r1)
2894                    do ipw=1,npw
2895                      kpga=kpg(ipw,nub1)
2896                      kpgb=kpg(ipw,nub2)
2897                      kpgc=kpg(ipw,nua1)
2898                      kpgd=kpg(ipw,nua2)
2899                      buffer_i1 = buffer_i1 + scalari(ipw,4+gama)*kpgb*kpgd+scalari(ipw,4+gamb)*kpga*kpgd &
2900 &                     + scalari(ipw,4+gamc)*kpgb*kpgc+scalari(ipw,4+gamd)*kpga*kpgc
2901                    end do
2902 !$OMP END DO
2903 !$OMP SINGLE
2904                    d2gxdt(1,mu,ilmn,ia,ispinor) =-scale2*buffer_i1
2905 !$OMP END SINGLE
2906                  end do
2907                end do
2908              end if
2909            end if
2910          end do
2911          ABI_FREE(scalarr)
2912          ABI_FREE(scalari)
2913        end if
2914 
2915 !      --------------------------------------------------------------------
2916 !      CHOICE= 8, 81  --  SIGNS= 1
2917 !      Accumulate d2Gxdt --- 2nd derivative wrt 2 k wave vect. --- for all dirs
2918 !      --------------------------------------------------------------------
2919        if ((signs==1).and.(choice_==8.or.choice_==81)) then
2920          mu0=1
2921          do ilmn=1,nlmn
2922            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
2923            scale=wt;if (il>1) scale=-scale
2924            if (cplex==2) then
2925 !$OMP SINGLE
2926              buffer_ra = zero ; buffer_rb = zero
2927              buffer_rc = zero ; buffer_rd = zero
2928              buffer_re = zero ; buffer_rf = zero
2929              buffer_ia = zero ; buffer_ib = zero
2930              buffer_ic = zero ; buffer_id = zero
2931              buffer_ie = zero ; buffer_if = zero
2932 !$OMP END SINGLE
2933 !$OMP DO &
2934 !$OMP REDUCTION(+:buffer_ra,buffer_rb,buffer_rc), &
2935 !$OMP REDUCTION(+:buffer_rd,buffer_re,buffer_rf), &
2936 !$OMP REDUCTION(+:buffer_ia,buffer_ib,buffer_ic), &
2937 !$OMP REDUCTION(+:buffer_id,buffer_ie,buffer_if)
2938              do ipw=1,npw
2939                buffer_ra = buffer_ra + scalr(ipw)*ffnl(ipw,5,ilmn)
2940                buffer_rb = buffer_rb + scalr(ipw)*ffnl(ipw,6,ilmn)
2941                buffer_rc = buffer_rc + scalr(ipw)*ffnl(ipw,7,ilmn)
2942                buffer_rd = buffer_rd + scalr(ipw)*ffnl(ipw,8,ilmn)
2943                buffer_re = buffer_re + scalr(ipw)*ffnl(ipw,9,ilmn)
2944                buffer_rf = buffer_rf + scalr(ipw)*ffnl(ipw,10,ilmn)
2945                buffer_ia = buffer_ia + scali(ipw)*ffnl(ipw,5,ilmn)
2946                buffer_ib = buffer_ib + scali(ipw)*ffnl(ipw,6,ilmn)
2947                buffer_ic = buffer_ic + scali(ipw)*ffnl(ipw,7,ilmn)
2948                buffer_id = buffer_id + scali(ipw)*ffnl(ipw,8,ilmn)
2949                buffer_ie = buffer_ie + scali(ipw)*ffnl(ipw,9,ilmn)
2950                buffer_if = buffer_if + scali(ipw)*ffnl(ipw,10,ilmn)
2951              end do
2952 !$OMP END DO
2953 !$OMP SINGLE
2954              if (parity) then
2955                d2gxdt(1,mu0  ,ilmn,ia,ispinor) = scale*buffer_ra
2956                d2gxdt(2,mu0  ,ilmn,ia,ispinor) = scale*buffer_ia
2957                d2gxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_rb
2958                d2gxdt(2,mu0+1,ilmn,ia,ispinor) = scale*buffer_ib
2959                d2gxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_rc
2960                d2gxdt(2,mu0+2,ilmn,ia,ispinor) = scale*buffer_ic
2961                d2gxdt(1,mu0+3,ilmn,ia,ispinor) = scale*buffer_rd
2962                d2gxdt(2,mu0+3,ilmn,ia,ispinor) = scale*buffer_id
2963                d2gxdt(1,mu0+4,ilmn,ia,ispinor) = scale*buffer_re
2964                d2gxdt(2,mu0+4,ilmn,ia,ispinor) = scale*buffer_ie
2965                d2gxdt(1,mu0+5,ilmn,ia,ispinor) = scale*buffer_rf
2966                d2gxdt(2,mu0+5,ilmn,ia,ispinor) = scale*buffer_if
2967              else
2968                d2gxdt(1,mu0  ,ilmn,ia,ispinor) =-scale*buffer_ia
2969                d2gxdt(2,mu0  ,ilmn,ia,ispinor) = scale*buffer_ra
2970                d2gxdt(1,mu0+1,ilmn,ia,ispinor) =-scale*buffer_ib
2971                d2gxdt(2,mu0+1,ilmn,ia,ispinor) = scale*buffer_rb
2972                d2gxdt(1,mu0+2,ilmn,ia,ispinor) =-scale*buffer_ic
2973                d2gxdt(2,mu0+2,ilmn,ia,ispinor) = scale*buffer_rc
2974                d2gxdt(1,mu0+3,ilmn,ia,ispinor) =-scale*buffer_id
2975                d2gxdt(2,mu0+3,ilmn,ia,ispinor) = scale*buffer_rd
2976                d2gxdt(1,mu0+4,ilmn,ia,ispinor) =-scale*buffer_ie
2977                d2gxdt(2,mu0+4,ilmn,ia,ispinor) = scale*buffer_re
2978                d2gxdt(1,mu0+5,ilmn,ia,ispinor) =-scale*buffer_if
2979                d2gxdt(2,mu0+5,ilmn,ia,ispinor) = scale*buffer_rf
2980              end if
2981 !$OMP END SINGLE
2982            else
2983              if (parity) then
2984 !$OMP SINGLE
2985                buffer_ra = zero ; buffer_rb = zero
2986                buffer_rc = zero ; buffer_rd = zero
2987                buffer_re = zero ; buffer_rf = zero
2988 !$OMP END SINGLE
2989 !$OMP DO &
2990 !$OMP REDUCTION(+:buffer_ra,buffer_rb,buffer_rc), &
2991 !$OMP REDUCTION(+:buffer_rd,buffer_re,buffer_rf)
2992                do ipw=1,npw
2993                  buffer_ra = buffer_ra + scalr(ipw)*ffnl(ipw,5,ilmn)
2994                  buffer_rb = buffer_rb + scalr(ipw)*ffnl(ipw,6,ilmn)
2995                  buffer_rc = buffer_rc + scalr(ipw)*ffnl(ipw,7,ilmn)
2996                  buffer_rd = buffer_rd + scalr(ipw)*ffnl(ipw,8,ilmn)
2997                  buffer_re = buffer_re + scalr(ipw)*ffnl(ipw,9,ilmn)
2998                  buffer_rf = buffer_rf + scalr(ipw)*ffnl(ipw,10,ilmn)
2999                end do
3000 !$OMP END DO
3001 !$OMP SINGLE
3002                d2gxdt(1,mu0  ,ilmn,ia,ispinor) = scale*buffer_ra
3003                d2gxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_rb
3004                d2gxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_rc
3005                d2gxdt(1,mu0+3,ilmn,ia,ispinor) = scale*buffer_rd
3006                d2gxdt(1,mu0+4,ilmn,ia,ispinor) = scale*buffer_re
3007                d2gxdt(1,mu0+5,ilmn,ia,ispinor) = scale*buffer_rf
3008 !$OMP END SINGLE
3009              else
3010 !$OMP SINGLE
3011                buffer_ia = zero ; buffer_ib = zero
3012                buffer_ic = zero ; buffer_id = zero
3013                buffer_ie = zero ; buffer_if = zero
3014 !$OMP END SINGLE
3015 !$OMP DO &
3016 !$OMP REDUCTION(+:buffer_ia,buffer_ib,buffer_ic), &
3017 !$OMP REDUCTION(+:buffer_id,buffer_ie,buffer_if)
3018                do ipw=1,npw
3019                  buffer_ia = buffer_ia + scali(ipw)*ffnl(ipw,5,ilmn)
3020                  buffer_ib = buffer_ib + scali(ipw)*ffnl(ipw,6,ilmn)
3021                  buffer_ic = buffer_ic + scali(ipw)*ffnl(ipw,7,ilmn)
3022                  buffer_id = buffer_id + scali(ipw)*ffnl(ipw,8,ilmn)
3023                  buffer_ie = buffer_ie + scali(ipw)*ffnl(ipw,9,ilmn)
3024                  buffer_if = buffer_if + scali(ipw)*ffnl(ipw,10,ilmn)
3025                end do
3026 !$OMP END DO
3027 !$OMP SINGLE
3028                d2gxdt(1,mu0  ,ilmn,ia,ispinor) =-scale*buffer_ia
3029                d2gxdt(1,mu0+1,ilmn,ia,ispinor) =-scale*buffer_ib
3030                d2gxdt(1,mu0+2,ilmn,ia,ispinor) =-scale*buffer_ic
3031                d2gxdt(1,mu0+3,ilmn,ia,ispinor) =-scale*buffer_id
3032                d2gxdt(1,mu0+4,ilmn,ia,ispinor) =-scale*buffer_ie
3033                d2gxdt(1,mu0+5,ilmn,ia,ispinor) =-scale*buffer_if
3034 !$OMP END SINGLE
3035              end if
3036            end if
3037          end do
3038        end if
3039 
3040 !      --------------------------------------------------------------------
3041 !      CHOICE= 8, 81 --  SIGNS= 2
3042 !      Accumulate d2Gxdt --- 2nd derivative wrt k --- for direction IDIR (Voigt not.)
3043 !      --------------------------------------------------------------------
3044        if ((signs==2).and.(choice_==8.or.choice_==81)) then
3045          mu0=1
3046          !idir= (xx=1, xy=2, xz=3, yx=4, yy=5, yz=6, zx=7, zy=8, zz=9)
3047          mua=idir1(idir);mub=idir2(idir)
3048          !idir->(Voigt) (11->1,22->2,33->3,32->4,31->5,21->6)
3049          ffnl_dir(1)=gamma(mua,mub)
3050          do ilmn=1,nlmn
3051            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
3052            scale=wt;if (il>1) scale=-scale
3053            if (cplex==2) then
3054 !$OMP SINGLE
3055              buffer_r1 = zero ; buffer_i1 = zero
3056 !$OMP END SINGLE
3057 !$OMP DO &
3058 !$OMP REDUCTION(+:buffer_r1,buffer_i1)
3059              do ipw=1,npw
3060                buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,4+ffnl_dir(1),ilmn)
3061                buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,4+ffnl_dir(1),ilmn)
3062              end do
3063 !$OMP END DO
3064 !$OMP SINGLE
3065              if (parity) then
3066                d2gxdt(1,mu0,ilmn,ia,ispinor) = scale*buffer_r1
3067                d2gxdt(2,mu0,ilmn,ia,ispinor) = scale*buffer_i1
3068              else
3069                d2gxdt(1,mu0,ilmn,ia,ispinor) =-scale*buffer_i1
3070                d2gxdt(2,mu0,ilmn,ia,ispinor) = scale*buffer_r1
3071              end if
3072 !$OMP END SINGLE
3073            else
3074              if (parity) then
3075 !$OMP SINGLE
3076                buffer_r1 = zero
3077 !$OMP END SINGLE
3078 !$OMP DO &
3079 !$OMP REDUCTION(+:buffer_r1)
3080                do ipw=1,npw
3081                  buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,4+ffnl_dir(1),ilmn)
3082                end do
3083 !$OMP END DO
3084 !$OMP SINGLE
3085                d2gxdt(1,mu0,ilmn,ia,ispinor) = scale*buffer_r1
3086 !$OMP END SINGLE
3087              else
3088 !$OMP SINGLE
3089                buffer_i1 = zero
3090 !$OMP END SINGLE
3091 !$OMP DO &
3092 !$OMP REDUCTION(+:buffer_i1)
3093                do ipw=1,npw
3094                  buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,4+ffnl_dir(1),ilmn)
3095                end do
3096 !$OMP SINGLE
3097                d2gxdt(1,mu0,ilmn,ia,ispinor) =-scale*buffer_i1
3098 !$OMP END SINGLE
3099              end if
3100            end if
3101          end do
3102        end if
3103 
3104 !      --------------------------------------------------------------------
3105 !      END CHOICES
3106 !      --------------------------------------------------------------------
3107 
3108      end do ! End loop on atoms
3109 
3110 !    Deallocate temporary space
3111 !$OMP SECTIONS
3112 !$OMP SECTION
3113      ABI_FREE(scali)
3114 !$OMP SECTION
3115      ABI_FREE(scalr)
3116 !$OMP END SECTIONS
3117 
3118    end do !  End loop on spinorial components
3119 !$OMP END PARALLEL
3120 
3121 !  ==========================================================================
3122  end if
3123 
3124 !Has to reduce arrays in case of FFT parallelization
3125  if (mpi_enreg%nproc_fft>1) then
3126    call timab(48,1,tsec)
3127    if (choice>=0) then
3128      call xmpi_sum(gx,mpi_enreg%comm_fft,ierr)
3129    end if
3130    if (choice_>1) then
3131      if (ndgxdt>0) then
3132        call xmpi_sum(dgxdt,mpi_enreg%comm_fft,ierr)
3133      end if
3134      if (nd2gxdt>0) then
3135        call xmpi_sum(d2gxdt,mpi_enreg%comm_fft,ierr)
3136      end if
3137    end if
3138    call timab(48,2,tsec)
3139  end if
3140 
3141 end subroutine opernla_ylm