LCOV - code coverage report
Current view: top level - src/66_nonlocal - m_opernla_ylm.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 70.4 % 821 578
Test Date: 2026-11-08 00:10:28 Functions: 100.0 % 1 1
Branches: 65.9 % 628 414

             Branch data     Line data    Source code
       1                 :             : !!****m* ABINIT/m_opernla_ylm
       2                 :             : !! NAME
       3                 :             : !!  m_opernla_ylm
       4                 :             : !!
       5                 :             : !! FUNCTION
       6                 :             : !!
       7                 :             : !! COPYRIGHT
       8                 :             : !!  Copyright (C) 2008-2026 ABINIT group (MT)
       9                 :             : !!  This file is distributed under the terms of the
      10                 :             : !!  GNU General Public License, see ~abinit/COPYING
      11                 :             : !!  or http://www.gnu.org/copyleft/gpl.txt .
      12                 :             : !!
      13                 :             : !! SOURCE
      14                 :             : 
      15                 :             : #if defined HAVE_CONFIG_H
      16                 :             : #include "config.h"
      17                 :             : #endif
      18                 :             : 
      19                 :             : #include "abi_common.h"
      20                 :             : 
      21                 :             : module m_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
      37                 :             : !!***
      38                 :             : 
      39                 :             :  public :: opernla_ylm
      40                 :             :  integer,public,save :: opernla_counter = -1
      41                 :             : 
      42                 :             : contains
      43                 :             : !!***
      44                 :             : 
      45                 :             : !!****f* ABINIT/opernla_ylm
      46                 :             : !! NAME
      47                 :             : !! opernla_ylm
      48                 :             : !!
      49                 :             : !! FUNCTION
      50                 :             : !! For a given wave-function |c>, get all projected scalars
      51                 :             : !! <p_lmn|c> where |p_lmn> are non-local projectors
      52                 :             : !!   With:
      53                 :             : !!   <p_lmn|c>=4pi/sqrt(vol) (i)^l Sum_g[c(g).f_nl(g).Y_lm(g).exp(2pi.i.g.R)]
      54                 :             : !!
      55                 :             : !! INPUTS
      56                 :             : !!  choice=chooses possible output:
      57                 :             : !!         if choice>=0: compute projected scalars
      58                 :             : !!         if choice<0: same as choice>0 but use already computed projected scalars
      59                 :             : !!         if ABS(choice)>1, then compute additional quantities:
      60                 :             : !!           2: compute projected scalars and derivatives wrt atm pos.
      61                 :             : !!           3: compute projected scalars and derivatives wrt strains
      62                 :             : !!           22: compute projected scalars and 2nd derivatives wrt atm pos. and q-vector.
      63                 :             : !!           23: compute projected scalars, derivatives wrt atm pos. and derivatives wrt strains
      64                 :             : !!           25: compute projected scalars and 3rd derivatives wrt atm pos. and two q-vectors.
      65                 :             : !!           4, 24: compute projected scalars, derivatives wrt atm pos.
      66                 :             : !!                  and 2nd derivatives wrt atm pos.
      67                 :             : !!           33: compute projected scalars and 2nd derivatives wrt strain and q-vector.
      68                 :             : !!           5,51,52: compute projected scalars and derivatives wrt wave vector k
      69                 :             : !!           53: compute projected scalars and derivatives wrt wave vector k in direction idir+1 and idir+2 mod 3
      70                 :             : !!           54: compute projected scalars, deriv. wrt atm pos., deriv. wrt wave vector k
      71                 :             : !!               and 2nd derivatives wrt right wave vector k and atm pos.
      72                 :             : !!           55: compute projected scalars, deriv. strains, deriv. wrt wave vector k
      73                 :             : !!               and 2nd derivatives wrt right wave vector k and strain
      74                 :             : !!           6: compute projected scalars, derivatives wrt atm pos., derivatives wrt strains,
      75                 :             : !!              2nd derivatives wrt 2 strains and derivatives wrt strain and atm pos.
      76                 :             : !!           7: not available
      77                 :             : !!           8: compute projected scalars, derivatives wrt wave vector k
      78                 :             : !!              and 2nd derivatives wrt 2 wave vectors k
      79                 :             : !!  cplex=1 if <p_lmn|c> scalars are real or pure imaginary (equivalent to istwfk>1)
      80                 :             : !!        2 if <p_lmn|c> scalars are complex
      81                 :             : !!  dimffnl=second dimension of ffnl
      82                 :             : !!  ffnl(npw,dimffnl,nlmn)= nonlocal quantities containing nonlocal form factors
      83                 :             : !!  ia3=gives the number of the first atom in the subset presently treated
      84                 :             : !!  idir=direction of the - atom to be moved in the case (choice=2,signs=2) or (choice=22,signs=2)
      85                 :             : !!                        - k point direction in the case (choice=5,signs=2)
      86                 :             : !!                        - strain component (1:6) in the case (choice=3,signs=2) or (choice=6,signs=1)
      87                 :             : !!                        - strain component (1:9) in the case (choice=33,signs=2)
      88                 :             : !!                        - (1:9) components to specify the atom to be moved and the second q-gradient
      89                 :             : !!                          direction in the case (choice=25,signs=2)
      90                 :             : !!  indlmn(6,nlmn)= array giving l,m,n,lm,ln,s for i=lmn
      91                 :             : !!  istwf_k=option parameter that describes the storage of wfs
      92                 :             : !!  kpg(npw,nkpg)=(k+G) components          for ikpg=1...3   (if nkpg=3 or 9)
      93                 :             : !!       [(k+G)_a].[(k+G)_b] quantities for ikpg=4...9   (if nkpg=9)
      94                 :             : !!       (k+G) Cartesian components for choice==33
      95                 :             : !!  matblk=dimension of the array ph3d
      96                 :             : !!  mpi_enreg=information about MPI parallelization
      97                 :             : !!  ndgxdt=second dimension of dgxdt
      98                 :             : !!  nd2gxdt=second dimension of d2gxdt
      99                 :             : !!  nincat=number of atoms in the subset here treated
     100                 :             : !!  nkpg=second dimension of array kpg (0, 3 or 9)
     101                 :             : !!  nlmn=number of (l,m,n) numbers for current type of atom
     102                 :             : !!  nloalg(3)=governs the choice of the algorithm for non-local operator.
     103                 :             : !!  npw=number of plane waves in reciprocal space
     104                 :             : !!  nspinor=number of spinorial components of the wavefunctions (on current proc)
     105                 :             : !!  ph3d(2,npw,matblk)=three-dimensional phase factors
     106                 :             : !!  [qdir]= optional, direction of the q-gradient (only for choice=22 choice=25 and choice=33)
     107                 :             : !!  signs=chooses possible output:
     108                 :             : !!   signs=1: compute derivatives in all directions
     109                 :             : !!   signs=2: compute derivative in direction IDIR only
     110                 :             : !!            compatible only with 1st-order derivatives and "single" derivatives
     111                 :             : !!  ucvol=unit cell volume (bohr^3)
     112                 :             : !!  vect(2,npw*my_nspinor)=starting vector in reciprocal space
     113                 :             : !!
     114                 :             : !! OUTPUT
     115                 :             : !!  if (choice>1) dgxdt(cplex,ndgxdt,nlmn,nincat,nspinor)=
     116                 :             : !!     gradients of projected scalars wrt coords  (choice=2, 23, 4, 54, 6)
     117                 :             : !!                                    wrt strains (choice=3, 23, 55)
     118                 :             : !!                                    wrt k wave vect. (choice=5, 51, 52, 53, 54, 55, 8)
     119                 :             : !!                                    wrt coords and q vect (choice=22)
     120                 :             : !!                                    wrt coords and two q vects (choice=25)
     121                 :             : !!                                    wrt strains and q vect (choice=33)
     122                 :             : !!  if (choice=4, 24, 33, 54, 55, 6, 8) d2gxdt(cplex,nd2gxdt,nlmn,nincat,nspinor)=
     123                 :             : !!     2nd grads of projected scalars wrt 2 coords (choice=4 or 24)
     124                 :             : !!                                    wrt coords & k wave vect. (choice=54)
     125                 :             : !!                                    wrt strains & k wave vect. (choice=55)
     126                 :             : !!                                    wrt coords & strains (choice=6)
     127                 :             : !!                                    wrt 2 strains (choice=6)
     128                 :             : !!                                    wrt 2 k wave vect. (choice=8)
     129                 :             : !!                                    wrt strains and q vect (choice=33)
     130                 :             : !!     only compatible with signs=1
     131                 :             : !!  cplex_dgxdt(ndgxdt) = used only when cplex = 1
     132                 :             : !!             cplex_dgxdt(i) = 1 if dgxdt(1,i,:,:)   is real, 2 if it is pure imaginary
     133                 :             : !!  cplex_d2gxdt(nd2gxdt) = used only when cplex = 1
     134                 :             : !!             cplex_d2gxdt(i) = 1 if d2gxdt(1,i,:,:) is real, 2 if it is pure imaginary
     135                 :             : !!
     136                 :             : !! SIDE EFFECTS
     137                 :             : !!  gx(cplex,nlmn,nincat,nspinor)= projected scalars - input if choice<0, output if choice>=0
     138                 :             : !!
     139                 :             : !! NOTES
     140                 :             : !! 1-The openMP version is different from the standard version:
     141                 :             : !!   the standard version is more effifient on one CPU core.
     142                 :             : !! 2-Operate for one type of atom, and within this given type of atom,
     143                 :             : !!   for a subset of at most nincat atoms.
     144                 :             : !!
     145                 :             : !! SOURCE
     146                 :             : 
     147                 :    61711416 : subroutine opernla_ylm(choice,cplex,cplex_dgxdt,cplex_d2gxdt,dimffnl,d2gxdt,dgxdt,ffnl,gx,&
     148                 :    30855708 : &       ia3,idir,indlmn,istwf_k,kpg,matblk,mpi_enreg,nd2gxdt,ndgxdt,nincat,nkpg,nlmn,&
     149         [ -  + ]:    30855708 : &       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                 :    30855708 :  real(dp),allocatable :: scali(:),scalr(:),scalari(:,:),scalarr(:,:)
     190                 :             : ! *************************************************************************
     191                 :             : 
     192         [ -  + ]:    30855708 :  if (choice==-1) return
     193                 :             : 
     194                 :             : !Useful variables
     195                 :    30855708 :  choice_=abs(choice)
     196         [ +  + ]:    30855708 :  wt=four_pi/sqrt(ucvol);if (cplex==1) wt=2.d0*wt
     197   [ +  +  +  + ]:    61244073 :  ipw0=1;if (istwf_k==2.and.mpi_enreg%me_g0_fft==1) ipw0=2
     198   [ +  +  +  +  :    38188329 :  cplex_dgxdt(:)  = 0 ; if (cplex == 1) cplex_dgxdt(:)  = 1
                   +  + ]
     199   [ +  +  +  +  :    32803089 :  cplex_d2gxdt(:) = 0 ; if (cplex == 1) cplex_d2gxdt(:) = 1
                   -  + ]
     200                 :    30855708 :  nthreads=1
     201                 :             : 
     202                 :             : !Check compatibility of options
     203         [ +  + ]:    30855708 :  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   [ +  +  -  + ]:     3420903 : &   choice_==6 .or.choice_==8 .or.choice_==81)
     209                 :           0 :    ABI_CHECK(check,'BUG: choice not compatible (for signs=1)')
     210                 :             :  end if
     211         [ +  + ]:    30855708 :  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   [ +  +  +  +  :    27434805 : &   choice_== 8.or.choice_==81)
             +  +  -  + ]
     217                 :           0 :    ABI_CHECK(check,'BUG: signs=2 not compatible with this choice')
     218                 :             :  end if
     219   [ +  +  +  + ]:    30855708 :  if (choice_==3.and.signs==2) then
     220                 :             : !  1<=idir<=6 is  required when choice=3 and signs=2
     221                 :      275952 :    check=(idir>=1.and.idir<=6)
     222         [ -  + ]:      275952 :    ABI_CHECK(check,'BUG: choice=3 and signs=2 requires 1<=idir<=6')
     223   [ +  +  +  - ]:    30579756 :  else if (choice_==25.and.signs==2) then
     224                 :             : !  1<=idir<=9 is  required when choice=25 and signs=2
     225                 :      248832 :    check=(idir>=1.and.idir<=9)
     226         [ -  + ]:      248832 :    ABI_CHECK(check,'BUG: choice=25 and signs=2 requires 1<=idir<=9')
     227   [ +  +  +  - ]:    30330924 :  else if (choice_==33.and.signs==2) then
     228                 :             : !  1<=idir<=9 is  required when choice=33 and signs=2
     229                 :      373248 :    check=(idir>=1.and.idir<=9)
     230         [ -  + ]:      373248 :    ABI_CHECK(check,'BUG: choice=33 and signs=2 requires 1<=idir<=9')
     231   [ +  +  +  +  :    29957676 :  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                 :      108741 :    check=(idir>=1.and.idir<=9)
     234         [ -  + ]:      108741 :    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   [ +  +  +  +  :    29848935 :    check=(signs/=2.or.choice<=1.or.(idir>=1.and.idir<=3))
                   -  + ]
     238                 :           0 :    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         [ -  + ]:    30855708 : if (opernla_counter>=0) then
     246         [ #  # ]:           0 :   if (choice>=0) opernla_counter = opernla_counter + 1
     247   [ #  #  #  # ]:           0 :   if ((signs==1).and.(choice_==2.or.choice_==4.or.choice_==6.or.choice_==23.or.choice_==24.or.choice_==54)) then
     248                 :           0 :     opernla_counter = opernla_counter + 3 ! 3 directions
     249                 :             :   end if
     250   [ #  #  #  # ]:           0 :   if ((signs==2).and.(choice_==2)) opernla_counter = opernla_counter + 1 ! 1 direction
     251   [ #  #  #  # ]:           0 :   if ((signs==1).and.(choice_==3.or.choice_==6.or.choice_==23.or.choice_==55)) opernla_counter = opernla_counter + 6 ! 6 directions
     252   [ #  #  #  # ]:           0 :   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         [ +  + ]:    63913278 :    do ispinor =1,nspinor
     263                 :    33057570 :      ipwshft=(ispinor-1)*npw
     264                 :             : 
     265                 :             : !    Allocate work space
     266   [ -  +  +  -  :    99172710 :      ABI_MALLOC(scali,(npw))
          +  -  +  -  -  
                +  -  + ]
     267   [ -  +  +  -  :    66115140 :      ABI_MALLOC(scalr,(npw))
             -  +  -  + ]
     268                 :             : 
     269                 :             : !    Loop on atoms (blocking)
     270         [ +  + ]:    79750756 :      do ia=1,nincat
     271         [ +  + ]:    46693186 :        iaph3d=ia;if (nloalg(2)>0) iaph3d=ia+ia3-1
     272                 :             : !      Compute c(g).exp(2pi.i.g.R)
     273         [ +  + ]: 16028041665 :        do ipw=ipw0,npw
     274                 : 15981348479 :          jpw=ipw+ipwshft
     275                 : 15981348479 :          scalr(ipw)=(vect(1,jpw)*ph3d(1,ipw,iaph3d)-vect(2,jpw)*ph3d(2,ipw,iaph3d))
     276                 : 16028041665 :          scali(ipw)=(vect(2,jpw)*ph3d(1,ipw,iaph3d)+vect(1,jpw)*ph3d(2,ipw,iaph3d))
     277                 :             :        end do
     278                 :             : 
     279         [ +  + ]:    46693186 :        if (ipw0==2) then
     280                 :     1850060 :          scalr(1)=half*vect(1,1+ipwshft)*ph3d(1,1,iaph3d)
     281                 :     1850060 :          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         [ +  + ]:    46693186 :        if (choice>=0) then
     290                 :             : 
     291         [ +  + ]:   548327010 :          do ilmn=1,nlmn
     292                 :   501978231 :            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
     293         [ +  + ]:   501978231 :            scale=wt;if (il>1) scale=-scale
     294         [ +  + ]:   548327010 :            if (cplex==2) then
     295                 :             :              buffer_r1 = zero ; buffer_i1 = zero
     296         [ +  + ]: >12746*10^7 :              do ipw=1,npw
     297                 : >12699*10^7 :                buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1,ilmn)
     298                 : >12746*10^7 :                buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1,ilmn)
     299                 :             :              end do
     300         [ +  + ]:   463072925 :              if (parity) then
     301                 :   210398608 :                gx(1,ilmn,ia,ispinor) = scale*buffer_r1 ; gx(2,ilmn,ia,ispinor) = scale*buffer_i1
     302                 :             :              else
     303                 :   252674317 :                gx(1,ilmn,ia,ispinor) =-scale*buffer_i1 ; gx(2,ilmn,ia,ispinor) = scale*buffer_r1
     304                 :             :              end if
     305                 :             :            else
     306         [ +  + ]:    38905306 :              if (parity) then
     307                 :             :                buffer_r1 =  zero
     308         [ +  + ]: 11186780386 :                do ipw=1,npw
     309                 : 11186780386 :                  buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1,ilmn)
     310                 :             :                end do
     311                 :    11102704 :                gx(1,ilmn,ia,ispinor) = scale*buffer_r1
     312                 :             :              else
     313                 :             :                buffer_i1 = zero
     314         [ +  + ]: 28712182242 :                do ipw=1,npw
     315                 : 28712182242 :                  buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1,ilmn)
     316                 :             :                end do
     317                 :    27802602 :                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   [ +  +  +  + ]:    46693186 :        if ((signs==1).and. &
     328                 :             : &       (choice_==2.or.choice_==4.or.choice_==6.or.choice_==23.or.choice_==24.or.choice_==54)) then
     329         [ +  + ]:     1259538 :          mu0=1;if (choice_==23.or.choice_==6) mu0=7
     330                 :             : 
     331         [ +  + ]:    13411421 :          do ilmn=1,nlmn
     332                 :    12151883 :            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
     333         [ +  + ]:    12151883 :            scale=wt;if (il>1) scale=-scale
     334                 :    12151883 :            scale2=two_pi*scale
     335         [ +  + ]:    54761042 :            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         [ +  + ]:  1964883120 :              do ipw=1,npw
     340                 :  1956453373 :                aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
     341                 :  1956453373 :                aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
     342                 :  1956453373 :                buffer_r1 = buffer_r1 - aux_i*kpg(ipw,1)
     343                 :  1956453373 :                buffer_r2 = buffer_r2 - aux_i*kpg(ipw,2)
     344                 :  1956453373 :                buffer_r3 = buffer_r3 - aux_i*kpg(ipw,3)
     345                 :  1956453373 :                buffer_i1 = buffer_i1 + aux_r*kpg(ipw,1)
     346                 :  1956453373 :                buffer_i2 = buffer_i2 + aux_r*kpg(ipw,2)
     347                 :  1964883120 :                buffer_i3 = buffer_i3 + aux_r*kpg(ipw,3)
     348                 :             :              end do
     349         [ +  + ]:     8429747 :              if (parity) then
     350                 :     3807271 :                dgxdt(1,mu0  ,ilmn,ia,ispinor) = scale2*buffer_r1
     351                 :     3807271 :                dgxdt(2,mu0  ,ilmn,ia,ispinor) = scale2*buffer_i1
     352                 :     3807271 :                dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale2*buffer_r2
     353                 :     3807271 :                dgxdt(2,mu0+1,ilmn,ia,ispinor) = scale2*buffer_i2
     354                 :     3807271 :                dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale2*buffer_r3
     355                 :     3807271 :                dgxdt(2,mu0+2,ilmn,ia,ispinor) = scale2*buffer_i3
     356                 :             :              else
     357                 :     4622476 :                dgxdt(1,mu0  ,ilmn,ia,ispinor) =-scale2*buffer_i1
     358                 :     4622476 :                dgxdt(2,mu0  ,ilmn,ia,ispinor) = scale2*buffer_r1
     359                 :     4622476 :                dgxdt(1,mu0+1,ilmn,ia,ispinor) =-scale2*buffer_i2
     360                 :     4622476 :                dgxdt(2,mu0+1,ilmn,ia,ispinor) = scale2*buffer_r2
     361                 :     4622476 :                dgxdt(1,mu0+2,ilmn,ia,ispinor) =-scale2*buffer_i3
     362                 :     4622476 :                dgxdt(2,mu0+2,ilmn,ia,ispinor) = scale2*buffer_r3
     363                 :             :              end if
     364                 :             :            else
     365         [ +  + ]:     3722136 :              if (parity) then
     366                 :             :                buffer_r1 = zero ; buffer_r2 = zero ; buffer_r3 = zero
     367         [ +  + ]:  1176050806 :                do ipw=1,npw
     368                 :  1175077572 :                  aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
     369                 :  1175077572 :                  buffer_r1 = buffer_r1 - aux_i*kpg(ipw,1)
     370                 :  1175077572 :                  buffer_r2 = buffer_r2 - aux_i*kpg(ipw,2)
     371                 :  1176050806 :                  buffer_r3 = buffer_r3 - aux_i*kpg(ipw,3)
     372                 :             :                end do
     373                 :      973234 :                dgxdt(1,mu0  ,ilmn,ia,ispinor) = scale2*buffer_r1
     374                 :      973234 :                dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale2*buffer_r2
     375                 :      973234 :                dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale2*buffer_r3
     376                 :             :              else
     377                 :             :                buffer_i1 = zero ; buffer_i2 = zero ; buffer_i3 = zero
     378         [ +  + ]:  3151478080 :                do ipw=1,npw
     379                 :  3148729178 :                  aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
     380                 :  3148729178 :                  buffer_i1 = buffer_i1 + aux_r*kpg(ipw,1)
     381                 :  3148729178 :                  buffer_i2 = buffer_i2 + aux_r*kpg(ipw,2)
     382                 :  3151478080 :                  buffer_i3 = buffer_i3 + aux_r*kpg(ipw,3)
     383                 :             :                end do
     384                 :     2748902 :                dgxdt(1,mu0  ,ilmn,ia,ispinor) =-scale2*buffer_i1
     385                 :     2748902 :                dgxdt(1,mu0+1,ilmn,ia,ispinor) =-scale2*buffer_i2
     386                 :     2748902 :                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   [ +  +  +  + ]:    46693186 :        if ((signs==2).and.(choice_==2)) then
     397                 :             : 
     398                 :    11826982 :          mu0=1
     399         [ +  + ]:    11826982 :          do ilmn=1,nlmn
     400                 :    10748170 :            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
     401         [ +  + ]:    10748170 :            scale=wt;if (il>1) scale=-scale
     402                 :    10748170 :            scale2=two_pi*scale
     403         [ +  - ]:    11826982 :            if (cplex==2) then
     404                 :             :              buffer_r1 = zero ; buffer_i1 = zero
     405         [ +  + ]:  1772506033 :              do ipw=1,npw
     406                 :  1761757863 :                aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
     407                 :  1761757863 :                aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
     408                 :  1761757863 :                buffer_r1 = buffer_r1 - aux_i*kpg(ipw,idir)
     409                 :  1772506033 :                buffer_i1 = buffer_i1 + aux_r*kpg(ipw,idir)
     410                 :             :              end do
     411         [ +  + ]:    10748170 :              if (parity) then
     412                 :     3271618 :                dgxdt(1,mu0,ilmn,ia,ispinor) = scale2*buffer_r1
     413                 :     3271618 :                dgxdt(2,mu0,ilmn,ia,ispinor) = scale2*buffer_i1
     414                 :             :              else
     415                 :     7476552 :                dgxdt(1,mu0,ilmn,ia,ispinor) =-scale2*buffer_i1
     416                 :     7476552 :                dgxdt(2,mu0,ilmn,ia,ispinor) = scale2*buffer_r1
     417                 :             :              end if
     418                 :             :            else
     419         [ #  # ]:           0 :              if (parity) then
     420                 :             :                buffer_r1 = zero
     421         [ #  # ]:           0 :                do ipw=1,npw
     422                 :           0 :                  buffer_r1 = buffer_r1 - scali(ipw)*ffnl(ipw,1,ilmn)*kpg(ipw,idir)
     423                 :             :                end do
     424                 :           0 :                dgxdt(1,mu0,ilmn,ia,ispinor) = scale2*buffer_r1
     425                 :             :              else
     426                 :             :                buffer_i1 = zero
     427         [ #  # ]:           0 :                do ipw=1,npw
     428                 :           0 :                  buffer_i1 = buffer_i1 + scalr(ipw)*ffnl(ipw,1,ilmn)*kpg(ipw,idir)
     429                 :             :                end do
     430                 :           0 :                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   [ +  +  +  + ]:    46693186 :        if (signs==2.and.(choice_==22.or.choice_==25)) then
     442                 :             :          !Use same notation as the notes for clarity
     443         [ +  + ]:      628832 :          if(choice_==22) ialpha=idir
     444         [ +  - ]:      248832 :          if(choice_==25) ialpha=nalpha(idir)
     445                 :             : 
     446                 :      628832 :          mu0=1
     447         [ +  + ]:     6052832 :          do ilmn=1,nlmn
     448                 :     5424000 :            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
     449         [ +  + ]:     5424000 :            scale=wt;if (il>1) scale=-scale
     450         [ +  - ]:     6052832 :            if (cplex==2) then
     451                 :             :              buffer_r1 = zero ; buffer_i1 = zero
     452         [ +  + ]:   549914364 :              do ipw=1,npw
     453                 :   544490364 :                aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
     454                 :   544490364 :                aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
     455                 :   544490364 :                buffer_r1 = buffer_r1 + aux_r*kpg(ipw,ialpha)
     456                 :   549914364 :                buffer_i1 = buffer_i1 + aux_i*kpg(ipw,ialpha)
     457                 :             :              end do
     458         [ +  + ]:     5424000 :              if (parity) then
     459                 :     2897664 :                dgxdt(1,mu0,ilmn,ia,ispinor) = scale*buffer_r1
     460                 :     2897664 :                dgxdt(2,mu0,ilmn,ia,ispinor) = scale*buffer_i1
     461                 :             :              else
     462                 :     2526336 :                dgxdt(1,mu0,ilmn,ia,ispinor) =-scale*buffer_i1
     463                 :     2526336 :                dgxdt(2,mu0,ilmn,ia,ispinor) = scale*buffer_r1
     464                 :             :              end if
     465                 :             :            else
     466         [ #  # ]:           0 :              if (parity) then
     467                 :             :                buffer_r1 = zero
     468         [ #  # ]:           0 :                do ipw=1,npw
     469                 :           0 :                  buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1,ilmn)*kpg(ipw,ialpha)
     470                 :             :                end do
     471                 :           0 :                dgxdt(1,mu0,ilmn,ia,ispinor) = scale*buffer_r1
     472                 :             :              else
     473                 :             :                buffer_i1 = zero
     474         [ #  # ]:           0 :                do ipw=1,npw
     475                 :           0 :                  buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1,ilmn)*kpg(ipw,ialpha)
     476                 :             :                end do
     477                 :           0 :                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   [ +  +  +  + ]:    46693186 :        if ((signs==1).and.(choice_==3.or.choice_==6.or.choice_==23.or.choice_==55)) then
     488                 :             : 
     489                 :     3076394 :          mu0=1
     490         [ +  + ]:     3076394 :          do ilmn=1,nlmn
     491                 :     2838077 :            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
     492         [ +  + ]:     2838077 :            scale=wt;if (il>1) scale=-scale
     493                 :     2838077 :            scale2=half*scale
     494         [ +  + ]:    44426015 :            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         [ +  + ]:  1051849278 :              do ipw=1,npw
     502                 :  1049076053 :                aux_r2 = scalr(ipw)*ffnl(ipw,2,ilmn)
     503                 :  1049076053 :                aux_r3 = scalr(ipw)*ffnl(ipw,3,ilmn)
     504                 :  1049076053 :                aux_r4 = scalr(ipw)*ffnl(ipw,4,ilmn)
     505                 :  1049076053 :                aux_i2 = scali(ipw)*ffnl(ipw,2,ilmn)
     506                 :  1049076053 :                aux_i3 = scali(ipw)*ffnl(ipw,3,ilmn)
     507                 :  1049076053 :                aux_i4 = scali(ipw)*ffnl(ipw,4,ilmn)
     508                 :  1049076053 :                buffer_r1 = buffer_r1 + aux_r2*kpg(ipw,1)
     509                 :  1049076053 :                buffer_r2 = buffer_r2 + aux_r3*kpg(ipw,2)
     510                 :  1049076053 :                buffer_r3 = buffer_r3 + aux_r4*kpg(ipw,3)
     511                 :  1049076053 :                buffer_r4 = buffer_r4 + aux_r4*kpg(ipw,2) + aux_r3*kpg(ipw,3)
     512                 :  1049076053 :                buffer_r5 = buffer_r5 + aux_r4*kpg(ipw,1) + aux_r2*kpg(ipw,3)
     513                 :  1049076053 :                buffer_r6 = buffer_r6 + aux_r3*kpg(ipw,1) + aux_r2*kpg(ipw,2)
     514                 :  1049076053 :                buffer_i1 = buffer_i1 + aux_i2*kpg(ipw,1)
     515                 :  1049076053 :                buffer_i2 = buffer_i2 + aux_i3*kpg(ipw,2)
     516                 :  1049076053 :                buffer_i3 = buffer_i3 + aux_i4*kpg(ipw,3)
     517                 :  1049076053 :                buffer_i4 = buffer_i4 + aux_i4*kpg(ipw,2) + aux_i3*kpg(ipw,3)
     518                 :  1049076053 :                buffer_i5 = buffer_i5 + aux_i4*kpg(ipw,1) + aux_i2*kpg(ipw,3)
     519                 :  1051849278 :                buffer_i6 = buffer_i6 + aux_i3*kpg(ipw,1) + aux_i2*kpg(ipw,2)
     520                 :             :              end do
     521         [ +  + ]:     2773225 :              if (parity) then
     522                 :     1359405 :                dgxdt(1,mu0  ,ilmn,ia,ispinor) =-scale*buffer_r1
     523                 :     1359405 :                dgxdt(2,mu0  ,ilmn,ia,ispinor) =-scale*buffer_i1
     524                 :     1359405 :                dgxdt(1,mu0+1,ilmn,ia,ispinor) =-scale*buffer_r2
     525                 :     1359405 :                dgxdt(2,mu0+1,ilmn,ia,ispinor) =-scale*buffer_i2
     526                 :     1359405 :                dgxdt(1,mu0+2,ilmn,ia,ispinor) =-scale*buffer_r3
     527                 :     1359405 :                dgxdt(2,mu0+2,ilmn,ia,ispinor) =-scale*buffer_i3
     528                 :     1359405 :                dgxdt(1,mu0+3,ilmn,ia,ispinor) =-scale2*buffer_r4
     529                 :     1359405 :                dgxdt(2,mu0+3,ilmn,ia,ispinor) =-scale2*buffer_i4
     530                 :     1359405 :                dgxdt(1,mu0+4,ilmn,ia,ispinor) =-scale2*buffer_r5
     531                 :     1359405 :                dgxdt(2,mu0+4,ilmn,ia,ispinor) =-scale2*buffer_i5
     532                 :     1359405 :                dgxdt(1,mu0+5,ilmn,ia,ispinor) =-scale2*buffer_r6
     533                 :     1359405 :                dgxdt(2,mu0+5,ilmn,ia,ispinor) =-scale2*buffer_i6
     534                 :             :              else
     535                 :     1413820 :                dgxdt(1,mu0  ,ilmn,ia,ispinor) = scale*buffer_i1
     536                 :     1413820 :                dgxdt(2,mu0  ,ilmn,ia,ispinor) =-scale*buffer_r1
     537                 :     1413820 :                dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_i2
     538                 :     1413820 :                dgxdt(2,mu0+1,ilmn,ia,ispinor) =-scale*buffer_r2
     539                 :     1413820 :                dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_i3
     540                 :     1413820 :                dgxdt(2,mu0+2,ilmn,ia,ispinor) =-scale*buffer_r3
     541                 :     1413820 :                dgxdt(1,mu0+3,ilmn,ia,ispinor) = scale2*buffer_i4
     542                 :     1413820 :                dgxdt(2,mu0+3,ilmn,ia,ispinor) =-scale2*buffer_r4
     543                 :     1413820 :                dgxdt(1,mu0+4,ilmn,ia,ispinor) = scale2*buffer_i5
     544                 :     1413820 :                dgxdt(2,mu0+4,ilmn,ia,ispinor) =-scale2*buffer_r5
     545                 :     1413820 :                dgxdt(1,mu0+5,ilmn,ia,ispinor) = scale2*buffer_i6
     546                 :     1413820 :                dgxdt(2,mu0+5,ilmn,ia,ispinor) =-scale2*buffer_r6
     547                 :             :              end if
     548                 :             :            else
     549         [ +  + ]:       64852 :              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         [ +  + ]:    37038778 :                do ipw=1,npw
     554                 :    37007072 :                  aux_r2 = scalr(ipw)*ffnl(ipw,2,ilmn)
     555                 :    37007072 :                  aux_r3 = scalr(ipw)*ffnl(ipw,3,ilmn)
     556                 :    37007072 :                  aux_r4 = scalr(ipw)*ffnl(ipw,4,ilmn)
     557                 :    37007072 :                  buffer_r1 = buffer_r1 + aux_r2*kpg(ipw,1)
     558                 :    37007072 :                  buffer_r2 = buffer_r2 + aux_r3*kpg(ipw,2)
     559                 :    37007072 :                  buffer_r3 = buffer_r3 + aux_r4*kpg(ipw,3)
     560                 :    37007072 :                  buffer_r4 = buffer_r4 + aux_r4*kpg(ipw,2) + aux_r3*kpg(ipw,3)
     561                 :    37007072 :                  buffer_r5 = buffer_r5 + aux_r4*kpg(ipw,1) + aux_r2*kpg(ipw,3)
     562                 :    37038778 :                  buffer_r6 = buffer_r6 + aux_r3*kpg(ipw,1) + aux_r2*kpg(ipw,2)
     563                 :             :                end do
     564                 :       31706 :                dgxdt(1,mu0  ,ilmn,ia,ispinor) =-scale*buffer_r1
     565                 :       31706 :                dgxdt(1,mu0+1,ilmn,ia,ispinor) =-scale*buffer_r2
     566                 :       31706 :                dgxdt(1,mu0+2,ilmn,ia,ispinor) =-scale*buffer_r3
     567                 :       31706 :                dgxdt(1,mu0+3,ilmn,ia,ispinor) =-scale2*buffer_r4
     568                 :       31706 :                dgxdt(1,mu0+4,ilmn,ia,ispinor) =-scale2*buffer_r5
     569                 :       31706 :                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         [ +  + ]:    34540264 :                do ipw=1,npw
     575                 :    34507118 :                  aux_i2 = scali(ipw)*ffnl(ipw,2,ilmn)
     576                 :    34507118 :                  aux_i3 = scali(ipw)*ffnl(ipw,3,ilmn)
     577                 :    34507118 :                  aux_i4 = scali(ipw)*ffnl(ipw,4,ilmn)
     578                 :    34507118 :                  buffer_i1 = buffer_i1 + aux_i2*kpg(ipw,1)
     579                 :    34507118 :                  buffer_i2 = buffer_i2 + aux_i3*kpg(ipw,2)
     580                 :    34507118 :                  buffer_i3 = buffer_i3 + aux_i4*kpg(ipw,3)
     581                 :    34507118 :                  buffer_i4 = buffer_i4 + aux_i4*kpg(ipw,2) + aux_i3*kpg(ipw,3)
     582                 :    34507118 :                  buffer_i5 = buffer_i5 + aux_i4*kpg(ipw,1) + aux_i2*kpg(ipw,3)
     583                 :    34540264 :                  buffer_i6 = buffer_i6 + aux_i3*kpg(ipw,1) + aux_i2*kpg(ipw,2)
     584                 :             :                end do
     585                 :       33146 :                dgxdt(1,mu0  ,ilmn,ia,ispinor) = scale*buffer_i1
     586                 :       33146 :                dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_i2
     587                 :       33146 :                dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_i3
     588                 :       33146 :                dgxdt(1,mu0+3,ilmn,ia,ispinor) = scale2*buffer_i4
     589                 :       33146 :                dgxdt(1,mu0+4,ilmn,ia,ispinor) = scale2*buffer_i5
     590                 :       33146 :                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   [ +  +  +  + ]:    46693186 :        if ((signs==2).and.(choice_==3)) then
     601                 :             : 
     602         [ +  + ]:      428832 :          mu0=1;ffnl_dir(1)=1;if (dimffnl>2) ffnl_dir(1)=idir
     603         [ +  + ]:     4215720 :          do ilmn=1,nlmn
     604                 :     3786888 :            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
     605         [ +  + ]:     3786888 :            scale=wt;if (il>1) scale=-scale
     606         [ +  - ]:     4215720 :            if (cplex==2) then
     607                 :             :              buffer_r1 = zero ; buffer_i1 = zero
     608         [ +  + ]:   653119200 :              do ipw=1,npw
     609                 :   649332312 :                buffer_r1 = buffer_r1 - scalr(ipw)*ffnl(ipw,1+ffnl_dir(1),ilmn)
     610                 :   653119200 :                buffer_i1 = buffer_i1 - scali(ipw)*ffnl(ipw,1+ffnl_dir(1),ilmn)
     611                 :             :              end do
     612         [ +  + ]:     3786888 :              if (parity) then
     613                 :     1606080 :                dgxdt(1,mu0,ilmn,ia,ispinor) = scale*buffer_r1
     614                 :     1606080 :                dgxdt(2,mu0,ilmn,ia,ispinor) = scale*buffer_i1
     615                 :             :              else
     616                 :     2180808 :                dgxdt(1,mu0,ilmn,ia,ispinor) =-scale*buffer_i1
     617                 :     2180808 :                dgxdt(2,mu0,ilmn,ia,ispinor) = scale*buffer_r1
     618                 :             :              end if
     619                 :             :            else
     620         [ #  # ]:           0 :              if (parity) then
     621                 :             :                buffer_r1 = zero
     622         [ #  # ]:           0 :                do ipw=1,npw
     623                 :           0 :                  buffer_r1 = buffer_r1 - scalr(ipw)*ffnl(ipw,1+ffnl_dir(1),ilmn)
     624                 :             :                end do
     625                 :           0 :                dgxdt(1,mu0,ilmn,ia,ispinor) = scale*buffer_r1
     626                 :             :              else
     627                 :             :                buffer_i1 = zero
     628         [ #  # ]:           0 :                do ipw=1,npw
     629                 :           0 :                  buffer_i1 = buffer_i1 - scali(ipw)*ffnl(ipw,1+ffnl_dir(1),ilmn)
     630                 :             :                end do
     631                 :           0 :                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   [ +  +  +  + ]:    46693186 :        if ((signs==2).and.(choice_==33)) then
     643                 :             : 
     644                 :             :          !Use same notation as the notes for clarity
     645                 :      746496 :          ibeta=nalpha(idir)
     646                 :      746496 :          idelta=nbeta(idir)
     647                 :      746496 :          igamma=qdir
     648                 :      746496 :          idelgam=gamma(idelta,igamma)
     649         [ +  + ]:     7216128 :          do ilmn=1,nlmn
     650                 :     6469632 :            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
     651         [ +  + ]:     6469632 :            scale=wt;if (il>1) scale=-scale
     652         [ +  - ]:     7216128 :            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         [ +  + ]:   645547968 :              do ipw=1,npw
     659                 :   639078336 :                aux_r = scalr(ipw)*ffnl(ipw,1+igamma,ilmn)
     660                 :   639078336 :                aux_i = scali(ipw)*ffnl(ipw,1+igamma,ilmn)
     661                 :   639078336 :                buffer_r1 = buffer_r1 + aux_r
     662                 :   639078336 :                buffer_i1 = buffer_i1 + aux_i
     663                 :   639078336 :                buffer_r2 = buffer_r2 + aux_r*kpg(ipw,ibeta)
     664                 :   639078336 :                buffer_i2 = buffer_i2 + aux_i*kpg(ipw,ibeta)
     665                 :   639078336 :                aux_r = scalr(ipw)*ffnl(ipw,1+idelta,ilmn)
     666                 :   639078336 :                aux_i = scali(ipw)*ffnl(ipw,1+idelta,ilmn)
     667                 :   639078336 :                buffer_r3 = buffer_r3 + aux_r
     668                 :   639078336 :                buffer_i3 = buffer_i3 + aux_i
     669                 :   639078336 :                buffer_r4 = buffer_r4 + aux_r*kpg(ipw,ibeta)
     670                 :   639078336 :                buffer_i4 = buffer_i4 + aux_i*kpg(ipw,ibeta)
     671                 :   639078336 :                aux_r = scalr(ipw)*ffnl(ipw,4+idelgam,ilmn)
     672                 :   639078336 :                aux_i = scali(ipw)*ffnl(ipw,4+idelgam,ilmn)
     673                 :   639078336 :                buffer_r5 = buffer_r5 + aux_r*kpg(ipw,ibeta)
     674                 :   645547968 :                buffer_i5 = buffer_i5 + aux_i*kpg(ipw,ibeta)
     675                 :             :              end do
     676                 :             : 
     677         [ +  + ]:     6469632 :              if (parity) then
     678                 :     3483648 :                dgxdt(1,1,ilmn,ia,ispinor) = scale*buffer_r1
     679                 :     3483648 :                dgxdt(2,1,ilmn,ia,ispinor) = scale*buffer_i1
     680                 :     3483648 :                dgxdt(1,2,ilmn,ia,ispinor) = scale*buffer_r3
     681                 :     3483648 :                dgxdt(2,2,ilmn,ia,ispinor) = scale*buffer_i3
     682                 :     3483648 :                d2gxdt(1,1,ilmn,ia,ispinor) = scale*buffer_r2
     683                 :     3483648 :                d2gxdt(2,1,ilmn,ia,ispinor) = scale*buffer_i2
     684                 :     3483648 :                d2gxdt(1,2,ilmn,ia,ispinor) = scale*buffer_r4
     685                 :     3483648 :                d2gxdt(2,2,ilmn,ia,ispinor) = scale*buffer_i4
     686                 :     3483648 :                d2gxdt(1,3,ilmn,ia,ispinor) = scale*buffer_r5
     687                 :     3483648 :                d2gxdt(2,3,ilmn,ia,ispinor) = scale*buffer_i5
     688                 :             :              else
     689                 :     2985984 :                dgxdt(1,1,ilmn,ia,ispinor) =-scale*buffer_i1
     690                 :     2985984 :                dgxdt(2,1,ilmn,ia,ispinor) = scale*buffer_r1
     691                 :     2985984 :                dgxdt(1,2,ilmn,ia,ispinor) =-scale*buffer_i3
     692                 :     2985984 :                dgxdt(2,2,ilmn,ia,ispinor) = scale*buffer_r3
     693                 :     2985984 :                d2gxdt(1,1,ilmn,ia,ispinor) =-scale*buffer_i2
     694                 :     2985984 :                d2gxdt(2,1,ilmn,ia,ispinor) = scale*buffer_r2
     695                 :     2985984 :                d2gxdt(1,2,ilmn,ia,ispinor) =-scale*buffer_i4
     696                 :     2985984 :                d2gxdt(2,2,ilmn,ia,ispinor) = scale*buffer_r4
     697                 :     2985984 :                d2gxdt(1,3,ilmn,ia,ispinor) =-scale*buffer_i5
     698                 :     2985984 :                d2gxdt(2,3,ilmn,ia,ispinor) = scale*buffer_r5
     699                 :             :              end if
     700                 :             :            else
     701         [ #  # ]:           0 :              if (parity) then
     702                 :             :                buffer_r1 = zero
     703                 :             :                buffer_r2 = zero
     704                 :             :                buffer_r3 = zero
     705                 :             :                buffer_r4 = zero
     706                 :             :                buffer_r5 = zero
     707         [ #  # ]:           0 :                do ipw=1,npw
     708                 :           0 :                  aux_r = scalr(ipw)*ffnl(ipw,1+igamma,ilmn)
     709                 :           0 :                  buffer_r1 = buffer_r1 + aux_r
     710                 :           0 :                  buffer_r2 = buffer_r2 + aux_r*kpg(ipw,ibeta)
     711                 :           0 :                  aux_r = scalr(ipw)*ffnl(ipw,1+idelta,ilmn)
     712                 :           0 :                  buffer_r3 = buffer_r3 + aux_r
     713                 :           0 :                  buffer_r4 = buffer_r4 + aux_r*kpg(ipw,ibeta)
     714                 :           0 :                  aux_r = scalr(ipw)*ffnl(ipw,4+idelgam,ilmn)
     715                 :           0 :                  buffer_r5 = buffer_r5 + aux_r*kpg(ipw,ibeta)
     716                 :             :                end do
     717                 :             : 
     718                 :           0 :                  dgxdt(1,1,ilmn,ia,ispinor) = scale*buffer_r1
     719                 :           0 :                  dgxdt(1,2,ilmn,ia,ispinor) = scale*buffer_r3
     720                 :           0 :                  d2gxdt(1,1,ilmn,ia,ispinor) = scale*buffer_r2
     721                 :           0 :                  d2gxdt(1,2,ilmn,ia,ispinor) = scale*buffer_r4
     722                 :           0 :                  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         [ #  # ]:           0 :                do ipw=1,npw
     730                 :           0 :                  aux_i = scali(ipw)*ffnl(ipw,1+igamma,ilmn)
     731                 :           0 :                  buffer_i1 = buffer_i1 + aux_i
     732                 :           0 :                  buffer_i2 = buffer_i2 + aux_i*kpg(ipw,ibeta)
     733                 :           0 :                  aux_i = scali(ipw)*ffnl(ipw,1+idelta,ilmn)
     734                 :           0 :                  buffer_i3 = buffer_i3 + aux_i
     735                 :           0 :                  buffer_i4 = buffer_i4 + aux_i*kpg(ipw,ibeta)
     736                 :           0 :                  aux_i = scali(ipw)*ffnl(ipw,4+idelgam,ilmn)
     737                 :           0 :                  buffer_i5 = buffer_i5 + aux_i*kpg(ipw,ibeta)
     738                 :             :                end do
     739                 :             : 
     740                 :           0 :                dgxdt(1,1,ilmn,ia,ispinor) =-scale*buffer_i1
     741                 :           0 :                dgxdt(1,2,ilmn,ia,ispinor) =-scale*buffer_i3
     742                 :           0 :                d2gxdt(1,1,ilmn,ia,ispinor) =-scale*buffer_i2
     743                 :           0 :                d2gxdt(1,2,ilmn,ia,ispinor) =-scale*buffer_i4
     744                 :           0 :                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   [ +  +  +  + ]:    46693186 :        if ((signs==1).and.(choice_==4.or.choice_==24)) then
     755                 :      514024 :          mu0=1
     756         [ +  + ]:      514024 :          do ilmn=1,nlmn
     757                 :      468336 :            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
     758         [ +  + ]:      468336 :            scale=wt;if (il>1) scale=-scale
     759                 :      468336 :            scale2=two_pi2*scale
     760         [ +  - ]:      514024 :            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         [ +  + ]:    61610952 :              do ipw=1,npw
     768                 :    61142616 :                aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
     769                 :    61142616 :                aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
     770                 :    61142616 :                buffer_ra = buffer_ra - aux_r*kpg(ipw,4)
     771                 :    61142616 :                buffer_rb = buffer_rb - aux_r*kpg(ipw,5)
     772                 :    61142616 :                buffer_rc = buffer_rc - aux_r*kpg(ipw,6)
     773                 :    61142616 :                buffer_rd = buffer_rd - aux_r*kpg(ipw,7)
     774                 :    61142616 :                buffer_re = buffer_re - aux_r*kpg(ipw,8)
     775                 :    61142616 :                buffer_rf = buffer_rf - aux_r*kpg(ipw,9)
     776                 :    61142616 :                buffer_ia = buffer_ia - aux_i*kpg(ipw,4)
     777                 :    61142616 :                buffer_ib = buffer_ib - aux_i*kpg(ipw,5)
     778                 :    61142616 :                buffer_ic = buffer_ic - aux_i*kpg(ipw,6)
     779                 :    61142616 :                buffer_id = buffer_id - aux_i*kpg(ipw,7)
     780                 :    61142616 :                buffer_ie = buffer_ie - aux_i*kpg(ipw,8)
     781                 :    61610952 :                buffer_if = buffer_if - aux_i*kpg(ipw,9)
     782                 :             :              end do
     783         [ +  + ]:      468336 :              if (parity) then
     784                 :      150288 :                d2gxdt(1,mu0  ,ilmn,ia,ispinor) = scale2*buffer_ra
     785                 :      150288 :                d2gxdt(2,mu0  ,ilmn,ia,ispinor) = scale2*buffer_ia
     786                 :      150288 :                d2gxdt(1,mu0+1,ilmn,ia,ispinor) = scale2*buffer_rb
     787                 :      150288 :                d2gxdt(2,mu0+1,ilmn,ia,ispinor) = scale2*buffer_ib
     788                 :      150288 :                d2gxdt(1,mu0+2,ilmn,ia,ispinor) = scale2*buffer_rc
     789                 :      150288 :                d2gxdt(2,mu0+2,ilmn,ia,ispinor) = scale2*buffer_ic
     790                 :      150288 :                d2gxdt(1,mu0+3,ilmn,ia,ispinor) = scale2*buffer_rd
     791                 :      150288 :                d2gxdt(2,mu0+3,ilmn,ia,ispinor) = scale2*buffer_id
     792                 :      150288 :                d2gxdt(1,mu0+4,ilmn,ia,ispinor) = scale2*buffer_re
     793                 :      150288 :                d2gxdt(2,mu0+4,ilmn,ia,ispinor) = scale2*buffer_ie
     794                 :      150288 :                d2gxdt(1,mu0+5,ilmn,ia,ispinor) = scale2*buffer_rf
     795                 :      150288 :                d2gxdt(2,mu0+5,ilmn,ia,ispinor) = scale2*buffer_if
     796                 :             :              else
     797                 :      318048 :                d2gxdt(1,mu0  ,ilmn,ia,ispinor) =-scale2*buffer_ia
     798                 :      318048 :                d2gxdt(2,mu0  ,ilmn,ia,ispinor) = scale2*buffer_ra
     799                 :      318048 :                d2gxdt(1,mu0+1,ilmn,ia,ispinor) =-scale2*buffer_ib
     800                 :      318048 :                d2gxdt(2,mu0+1,ilmn,ia,ispinor) = scale2*buffer_rb
     801                 :      318048 :                d2gxdt(1,mu0+2,ilmn,ia,ispinor) =-scale2*buffer_ic
     802                 :      318048 :                d2gxdt(2,mu0+2,ilmn,ia,ispinor) = scale2*buffer_rc
     803                 :      318048 :                d2gxdt(1,mu0+3,ilmn,ia,ispinor) =-scale2*buffer_id
     804                 :      318048 :                d2gxdt(2,mu0+3,ilmn,ia,ispinor) = scale2*buffer_rd
     805                 :      318048 :                d2gxdt(1,mu0+4,ilmn,ia,ispinor) =-scale2*buffer_ie
     806                 :      318048 :                d2gxdt(2,mu0+4,ilmn,ia,ispinor) = scale2*buffer_re
     807                 :      318048 :                d2gxdt(1,mu0+5,ilmn,ia,ispinor) =-scale2*buffer_if
     808                 :      318048 :                d2gxdt(2,mu0+5,ilmn,ia,ispinor) = scale2*buffer_rf
     809                 :             :              end if
     810                 :             :            else
     811         [ #  # ]:           0 :              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         [ #  # ]:           0 :                do ipw=1,npw
     816                 :           0 :                  aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
     817                 :           0 :                  aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
     818                 :           0 :                  buffer_ra = buffer_ra - aux_r*kpg(ipw,4)
     819                 :           0 :                  buffer_rb = buffer_rb - aux_r*kpg(ipw,5)
     820                 :           0 :                  buffer_rc = buffer_rc - aux_r*kpg(ipw,6)
     821                 :           0 :                  buffer_rd = buffer_rd - aux_r*kpg(ipw,7)
     822                 :           0 :                  buffer_re = buffer_re - aux_r*kpg(ipw,8)
     823                 :           0 :                  buffer_rf = buffer_rf - aux_r*kpg(ipw,9)
     824                 :             :                end do
     825                 :           0 :                d2gxdt(1,mu0  ,ilmn,ia,ispinor) = scale2*buffer_ra
     826                 :           0 :                d2gxdt(1,mu0+1,ilmn,ia,ispinor) = scale2*buffer_rb
     827                 :           0 :                d2gxdt(1,mu0+2,ilmn,ia,ispinor) = scale2*buffer_rc
     828                 :           0 :                d2gxdt(1,mu0+3,ilmn,ia,ispinor) = scale2*buffer_rd
     829                 :           0 :                d2gxdt(1,mu0+4,ilmn,ia,ispinor) = scale2*buffer_re
     830                 :           0 :                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         [ #  # ]:           0 :                do ipw=1,npw
     836                 :           0 :                  aux_r = scalr(ipw)*ffnl(ipw,1,ilmn)
     837                 :           0 :                  aux_i = scali(ipw)*ffnl(ipw,1,ilmn)
     838                 :           0 :                  buffer_ia = buffer_ia - aux_i*kpg(ipw,4)
     839                 :           0 :                  buffer_ib = buffer_ib - aux_i*kpg(ipw,5)
     840                 :           0 :                  buffer_ic = buffer_ic - aux_i*kpg(ipw,6)
     841                 :           0 :                  buffer_id = buffer_id - aux_i*kpg(ipw,7)
     842                 :           0 :                  buffer_ie = buffer_ie - aux_i*kpg(ipw,8)
     843                 :           0 :                  buffer_if = buffer_if - aux_i*kpg(ipw,9)
     844                 :             :                end do
     845                 :           0 :                d2gxdt(1,mu0  ,ilmn,ia,ispinor) =-scale2*buffer_ia
     846                 :           0 :                d2gxdt(1,mu0+1,ilmn,ia,ispinor) =-scale2*buffer_ib
     847                 :           0 :                d2gxdt(1,mu0+2,ilmn,ia,ispinor) =-scale2*buffer_ic
     848                 :           0 :                d2gxdt(1,mu0+3,ilmn,ia,ispinor) =-scale2*buffer_id
     849                 :           0 :                d2gxdt(1,mu0+4,ilmn,ia,ispinor) =-scale2*buffer_ie
     850                 :           0 :                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   [ +  +  +  +  :    46693186 :        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                 :      117616 :          mu0=1
     864         [ +  + ]:      117616 :          if (choice_==54) mu0=4
     865         [ +  + ]:       94192 :          if (choice_==55) mu0=7
     866         [ +  + ]:     1076784 :          do ilmn=1,nlmn
     867                 :      959168 :            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
     868         [ +  + ]:      959168 :            scale=wt;if (il>1) scale=-scale
     869         [ +  - ]:    47652354 :            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         [ +  + ]:   125910464 :              do ipw=1,npw
     875                 :   124951296 :                buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,2,ilmn)
     876                 :   124951296 :                buffer_r2 = buffer_r2 + scalr(ipw)*ffnl(ipw,3,ilmn)
     877                 :   124951296 :                buffer_r3 = buffer_r3 + scalr(ipw)*ffnl(ipw,4,ilmn)
     878                 :   124951296 :                buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,2,ilmn)
     879                 :   124951296 :                buffer_i2 = buffer_i2 + scali(ipw)*ffnl(ipw,3,ilmn)
     880                 :   125910464 :                buffer_i3 = buffer_i3 + scali(ipw)*ffnl(ipw,4,ilmn)
     881                 :             :              end do
     882         [ +  + ]:      959168 :              if (parity) then
     883                 :      250976 :                dgxdt(1,mu0  ,ilmn,ia,ispinor) = scale*buffer_r1
     884                 :      250976 :                dgxdt(2,mu0  ,ilmn,ia,ispinor) = scale*buffer_i1
     885                 :      250976 :                dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_r2
     886                 :      250976 :                dgxdt(2,mu0+1,ilmn,ia,ispinor) = scale*buffer_i2
     887                 :      250976 :                dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_r3
     888                 :      250976 :                dgxdt(2,mu0+2,ilmn,ia,ispinor) = scale*buffer_i3
     889                 :             :              else
     890                 :      708192 :                dgxdt(1,mu0  ,ilmn,ia,ispinor) =-scale*buffer_i1
     891                 :      708192 :                dgxdt(2,mu0  ,ilmn,ia,ispinor) = scale*buffer_r1
     892                 :      708192 :                dgxdt(1,mu0+1,ilmn,ia,ispinor) =-scale*buffer_i2
     893                 :      708192 :                dgxdt(2,mu0+1,ilmn,ia,ispinor) = scale*buffer_r2
     894                 :      708192 :                dgxdt(1,mu0+2,ilmn,ia,ispinor) =-scale*buffer_i3
     895                 :      708192 :                dgxdt(2,mu0+2,ilmn,ia,ispinor) = scale*buffer_r3
     896                 :             :              end if
     897                 :             :            else
     898         [ #  # ]:           0 :              cplex_dgxdt(mu0:mu0+2) = 2 ! Warning dgxdt is here pure imaginary
     899         [ #  # ]:           0 :              if (parity) then
     900                 :             :                buffer_i1 = zero ; buffer_i2 = zero
     901                 :             :                buffer_i3 = zero
     902         [ #  # ]:           0 :                do ipw=1,npw
     903                 :           0 :                  buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,2,ilmn)
     904                 :           0 :                  buffer_i2 = buffer_i2 + scali(ipw)*ffnl(ipw,3,ilmn)
     905                 :           0 :                  buffer_i3 = buffer_i3 + scali(ipw)*ffnl(ipw,4,ilmn)
     906                 :             :                end do
     907                 :           0 :                dgxdt(1,mu0  ,ilmn,ia,ispinor) = scale*buffer_i1
     908                 :           0 :                dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_i2
     909                 :           0 :                dgxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_i3
     910                 :             :              else
     911                 :             :                buffer_r1 = zero ; buffer_r2 = zero
     912                 :             :                buffer_r3 = zero
     913         [ #  # ]:           0 :                do ipw=1,npw
     914                 :           0 :                  buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,2,ilmn)
     915                 :           0 :                  buffer_r2 = buffer_r2 + scalr(ipw)*ffnl(ipw,3,ilmn)
     916                 :           0 :                  buffer_r3 = buffer_r3 + scalr(ipw)*ffnl(ipw,4,ilmn)
     917                 :             :                end do
     918                 :           0 :                dgxdt(1,mu0  ,ilmn,ia,ispinor) = scale*buffer_r1
     919                 :           0 :                dgxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_r2
     920                 :           0 :                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   [ +  +  +  +  :    46693186 :        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                 :     1703417 :          mu0=1
     938   [ +  +  -  + ]:     1703417 :          if (choice_==5.or.choice_==51.or.choice_==52) then
     939                 :             : !          We compute the derivative in one direction
     940         [ +  + ]:     1573952 :            ffnl_dir(1)=1;if(dimffnl>2) ffnl_dir(1)=idir
     941                 :             :            ndir=1
     942                 :             :          end if
     943         [ -  + ]:     1703417 :          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                 :           0 :            ffnl_dir(1)=ffnl_dir_dat(2*idir-1);ffnl_dir(2)=ffnl_dir_dat(2*idir)
     950                 :           0 :            ndir=2
     951                 :             :          end if
     952         [ +  + ]:     1703417 :          if (choice_==54) then
     953                 :             : !          We compute the derivative in one direction (the second one)
     954         [ +  - ]:       23040 :            ffnl_dir(1)=1;if(dimffnl>2) ffnl_dir(1)=idir2(idir)
     955                 :             :            ndir=1
     956                 :             :          end if
     957         [ +  + ]:     1703417 :          if (choice_==8) then
     958                 :             : !          We compute the derivative in two directions
     959                 :             : !          depending on the input idir argument
     960                 :      101817 :            ffnl_dir(1)=idir1(idir);ffnl_dir(2)=idir2(idir)
     961                 :      101817 :            ndir=2
     962                 :             :          end if
     963         [ +  + ]:     1703417 :          if (choice_==81) then
     964                 :             : !          We compute the derivative in one direction (the second one)
     965                 :        4608 :            ffnl_dir(1)=idir2(idir)
     966                 :        4608 :            ndir=1
     967                 :             :          end if
     968         [ +  + ]:     3508651 :          do mua=1,ndir
     969                 :    18272978 :            mu=mu0+mua-1
     970         [ +  + ]:    64966164 :            do ilmn=1,nlmn
     971                 :    16467744 :              il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
     972         [ +  + ]:    16467744 :              scale=wt;if (il>1) scale=-scale
     973         [ +  - ]:    18272978 :              if (cplex==2) then
     974                 :             :                buffer_r1 = zero ; buffer_i1 = zero
     975         [ +  + ]:  2650987936 :                do ipw=1,npw
     976                 :  2634520192 :                  buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1+ffnl_dir(mua),ilmn)
     977                 :  2650987936 :                  buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1+ffnl_dir(mua),ilmn)
     978                 :             :                end do
     979         [ +  + ]:    16467744 :                if (parity) then
     980                 :     7658508 :                  dgxdt(1,mu,ilmn,ia,ispinor) = scale*buffer_r1
     981                 :     7658508 :                  dgxdt(2,mu,ilmn,ia,ispinor) = scale*buffer_i1
     982                 :             :                else
     983                 :     8809236 :                  dgxdt(1,mu,ilmn,ia,ispinor) =-scale*buffer_i1
     984                 :     8809236 :                  dgxdt(2,mu,ilmn,ia,ispinor) = scale*buffer_r1
     985                 :             :                end if
     986                 :             :              else
     987                 :           0 :                cplex_dgxdt(mu) = 2 ! Warning dgxdt is here pure imaginary
     988         [ #  # ]:           0 :                if (parity) then
     989                 :             :                  buffer_i1 = zero
     990         [ #  # ]:           0 :                  do ipw=1,npw
     991                 :           0 :                    buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1+ffnl_dir(mua),ilmn)
     992                 :             :                  end do
     993                 :           0 :                  dgxdt(1,mu,ilmn,ia,ispinor) = scale*buffer_i1
     994                 :             :                else
     995                 :             :                  buffer_r1 = zero
     996         [ #  # ]:           0 :                  do ipw=1,npw
     997                 :           0 :                    buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1+ffnl_dir(mua),ilmn)
     998                 :             :                  end do
     999                 :           0 :                  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   [ +  +  +  + ]:    46693186 :        if ((signs==1).and.(choice_==54)) then
    1011                 :      220736 :          mu0=1
    1012         [ +  + ]:      220736 :          do ilmn=1,nlmn
    1013                 :      197312 :            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
    1014         [ +  + ]:      197312 :            scale=wt;if (il>1) scale=-scale
    1015                 :      197312 :            scale2=two_pi*scale
    1016         [ +  - ]:      220736 :            if (cplex==2) then
    1017         [ +  + ]:      789248 :              do mua=1,3 ! atm. pos
    1018         [ +  + ]:     2565056 :                do mub=1,3 ! k
    1019                 :     1775808 :                  mu=mu0+(mub-1)+3*(mua-1)
    1020                 :     1775808 :                  buffer_r1 = zero ; buffer_i1 = zero
    1021         [ +  + ]:   224769600 :                  do ipw=1,npw
    1022                 :   222993792 :                    buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
    1023                 :   224769600 :                    buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
    1024                 :             :                  end do
    1025         [ +  + ]:     2367744 :                  if (parity) then
    1026                 :      499680 :                    d2gxdt(1,mu,ilmn,ia,ispinor) =-scale2*buffer_i1
    1027                 :      499680 :                    d2gxdt(2,mu,ilmn,ia,ispinor) = scale2*buffer_r1
    1028                 :             :                  else
    1029                 :     1276128 :                    d2gxdt(1,mu,ilmn,ia,ispinor) =-scale2*buffer_r1
    1030                 :     1276128 :                    d2gxdt(2,mu,ilmn,ia,ispinor) =-scale2*buffer_i1
    1031                 :             :                  end if
    1032                 :             :                end do
    1033                 :             :              end do
    1034                 :             :            else
    1035         [ #  # ]:           0 :              cplex_d2gxdt(mu0:mu0+8) = 2 ! Warning d2gxdt is here pure imaginary
    1036         [ #  # ]:           0 :              if (parity) then
    1037         [ #  # ]:           0 :                do mua=1,3 ! atm. pos
    1038         [ #  # ]:           0 :                  do mub=1,3 ! k
    1039                 :           0 :                    mu=mu0+(mub-1)+3*(mua-1)
    1040                 :           0 :                    buffer_r1 = zero
    1041         [ #  # ]:           0 :                    do ipw=1,npw
    1042                 :           0 :                      buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
    1043                 :             :                    end do
    1044                 :           0 :                    d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_r1
    1045                 :             :                  end do
    1046                 :             :                end do
    1047                 :             :              else
    1048         [ #  # ]:           0 :                do mua=1,3 ! atm. pos
    1049         [ #  # ]:           0 :                  do mub=1,3 ! k
    1050                 :           0 :                    mu=mu0+(mub-1)+3*(mua-1)
    1051                 :           0 :                    buffer_i1 = zero
    1052         [ #  # ]:           0 :                    do ipw=1,npw
    1053                 :           0 :                      buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
    1054                 :             :                    end do
    1055                 :           0 :                    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   [ +  +  +  + ]:    46693186 :        if ((signs==2).and.(choice_==54)) then
    1068                 :       23040 :          mu0=1
    1069                 :             :          !idir= (xx=1, xy=2, xz=3, yx=4, yy=5, yz=6, zx=7, zy=8, zz=9)
    1070                 :       23040 :          mua=idir1(idir) ! atm. pos
    1071         [ +  - ]:       23040 :          mub=1;if(dimffnl>2) mub=idir2(idir) ! k
    1072         [ +  + ]:      207360 :          do ilmn=1,nlmn
    1073                 :      184320 :            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
    1074         [ -  + ]:      184320 :            scale=wt;if (il>1) scale=-scale
    1075                 :      184320 :            scale2=two_pi*scale
    1076         [ +  - ]:      207360 :            if (cplex==2) then
    1077                 :             :              buffer_r1 = zero ; buffer_i1 = zero
    1078         [ +  + ]:    17556480 :              do ipw=1,npw
    1079                 :    17372160 :                buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
    1080                 :    17556480 :                buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
    1081                 :             :              end do
    1082         [ +  + ]:      184320 :              if (parity) then
    1083                 :       46080 :                d2gxdt(1,mu0,ilmn,ia,ispinor) =-scale2*buffer_i1
    1084                 :       46080 :                d2gxdt(2,mu0,ilmn,ia,ispinor) = scale2*buffer_r1
    1085                 :             :              else
    1086                 :      138240 :                d2gxdt(1,mu0,ilmn,ia,ispinor) =-scale2*buffer_r1
    1087                 :      138240 :                d2gxdt(2,mu0,ilmn,ia,ispinor) =-scale2*buffer_i1
    1088                 :             :              end if
    1089                 :             :            else
    1090                 :           0 :              cplex_d2gxdt(mu0) = 2 ! Warning d2gxdt is here pure imaginary
    1091         [ #  # ]:           0 :              if (parity) then
    1092                 :             :                buffer_r1 = zero
    1093         [ #  # ]:           0 :                do ipw=1,npw
    1094                 :           0 :                  buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
    1095                 :             :                end do
    1096                 :           0 :                d2gxdt(1,mu0,ilmn,ia,ispinor) = scale2*buffer_r1
    1097                 :             :              else
    1098                 :             :                buffer_i1 = zero
    1099         [ #  # ]:           0 :                do ipw=1,npw
    1100                 :           0 :                  buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,1+mub,ilmn)*kpg(ipw,mua)
    1101                 :             :                end do
    1102                 :           0 :                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   [ +  +  +  + ]:    46693186 :        if ((signs==1).and.(choice_==55)) then
    1113                 :       56288 :          mu0=1
    1114         [ +  + ]:       56288 :          do ilmn=1,nlmn
    1115                 :       50496 :            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
    1116         [ +  + ]:       50496 :            scale=wt;if (il>1) scale=-scale
    1117         [ +  - ]:       56288 :            if (cplex==2) then
    1118         [ +  + ]:      353472 :              do mua=1,6 ! strain
    1119         [ +  + ]:     1262400 :                do mub=1,3 ! k
    1120                 :      908928 :                  mu=mu0+(mub-1)+3*(mua-1)
    1121                 :      908928 :                  buffer_r1 = zero ; buffer_i1 = zero
    1122         [ +  + ]:   173664000 :                  do ipw=1,npw
    1123                 :   172755072 :                    aux_r=ffnl(ipw,4+mua ,ilmn)*kpg(ipw,mub)
    1124                 :   172755072 :                    buffer_r1 = buffer_r1 + aux_r*scalr(ipw)
    1125                 :   173664000 :                    buffer_i1 = buffer_i1 + aux_r*scali(ipw)
    1126                 :             :                  end do
    1127         [ +  + ]:     1211904 :                  if (parity) then
    1128                 :      272160 :                    d2gxdt(1,mu,ilmn,ia,ispinor) =-scale*buffer_r1
    1129                 :      272160 :                    d2gxdt(2,mu,ilmn,ia,ispinor) =-scale*buffer_i1
    1130                 :             :                  else
    1131                 :      636768 :                    d2gxdt(1,mu,ilmn,ia,ispinor) = scale*buffer_i1
    1132                 :      636768 :                    d2gxdt(2,mu,ilmn,ia,ispinor) =-scale*buffer_r1
    1133                 :             :                  end if
    1134                 :             :                end do
    1135                 :             :              end do
    1136                 :             :            else
    1137         [ #  # ]:           0 :              cplex_d2gxdt(mu0:mu0+17) = 2 ! Warning d2gxdt is here pure imaginary
    1138         [ #  # ]:           0 :              if (parity) then
    1139         [ #  # ]:           0 :                do mua=1,6 ! strain
    1140         [ #  # ]:           0 :                  do mub=1,3 ! k
    1141                 :           0 :                    mu=mu0+(mub-1)+3*(mua-1)
    1142                 :           0 :                    buffer_i1 = zero
    1143         [ #  # ]:           0 :                    do ipw=1,npw
    1144                 :           0 :                      buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,4+mua,ilmn)*kpg(ipw,mub)
    1145                 :             :                    end do
    1146                 :           0 :                    d2gxdt(1,mu,ilmn,ia,ispinor) =-scale*buffer_i1
    1147                 :             :                  end do
    1148                 :             :                end do
    1149                 :             :              else
    1150         [ #  # ]:           0 :                do mua=1,6 ! strain
    1151         [ #  # ]:           0 :                  do mub=1,3 ! k
    1152                 :           0 :                    mu=mu0+(mub-1)+3*(mua-1)
    1153                 :           0 :                    buffer_r1 = zero
    1154         [ #  # ]:           0 :                    do ipw=1,npw
    1155                 :           0 :                      buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,4+mua,ilmn)*kpg(ipw,mub)
    1156                 :             :                    end do
    1157                 :           0 :                    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   [ +  +  +  + ]:    46693186 :        if ((signs==1).and.(choice_==6)) then
    1170                 :             :          mu0=1;if (choice_==6) mu0=37
    1171   [ -  +  +  -  :       16128 :          ABI_MALLOC(scalarr,(npw,4))
          +  -  +  -  -  
                +  -  + ]
    1172   [ -  +  +  -  :       10752 :          ABI_MALLOC(scalari,(npw,4))
             -  +  -  + ]
    1173         [ +  + ]:       50432 :          do ilmn=1,nlmn
    1174                 :       45056 :            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
    1175         [ +  + ]:       45056 :            scale=wt;if (il>1) scale=-scale
    1176                 :       45056 :            scale2=pi*scale
    1177         [ +  + ]:      225280 :            do mu=1,4
    1178         [ +  + ]:    38405376 :              do ipw=1,npw
    1179                 :    38180096 :                scalarr(ipw,mu)=scalr(ipw)*ffnl(ipw,mu,ilmn)
    1180                 :    38360320 :                scalari(ipw,mu)=scali(ipw)*ffnl(ipw,mu,ilmn)
    1181                 :             :              end do
    1182                 :             :            end do
    1183         [ +  - ]:       50432 :            if(cplex==2) then
    1184         [ +  + ]:      315392 :              do mub=1,6
    1185                 :      270336 :                nub1=alpha(mub);nub2=beta(mub)
    1186         [ +  + ]:     1126400 :                do mua=1,3
    1187                 :      811008 :                  mu=mu0+(mua-1)+3*(mub-1)
    1188                 :      811008 :                  buffer_r1 = zero ; buffer_i1 = zero
    1189         [ +  + ]:   172621440 :                  do ipw=1,npw
    1190                 :             :                    buffer_r1 = buffer_r1 + kpg(ipw,mua)*(scalarr(ipw,1+nub1)*kpg(ipw,nub2) + &
    1191                 :   171810432 : &                   scalarr(ipw,1+nub2)*kpg(ipw,nub1))
    1192                 :             :                    buffer_i1 = buffer_i1 + kpg(ipw,mua)*(scalari(ipw,1+nub1)*kpg(ipw,nub2) + &
    1193                 :   172621440 : &                   scalari(ipw,1+nub2)*kpg(ipw,nub1))
    1194                 :             :                  end do
    1195         [ +  + ]:     1081344 :                  if (parity) then
    1196                 :      340992 :                    d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_i1
    1197                 :      340992 :                    d2gxdt(2,mu,ilmn,ia,ispinor) =-scale2*buffer_r1
    1198                 :             :                  else
    1199                 :      470016 :                    d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_r1
    1200                 :      470016 :                    d2gxdt(2,mu,ilmn,ia,ispinor) = scale2*buffer_i1
    1201                 :             :                  end if
    1202                 :             :                end do
    1203                 :             :              end do
    1204                 :             :            else
    1205         [ #  # ]:           0 :              if (parity) then
    1206         [ #  # ]:           0 :                do mub=1,6
    1207                 :           0 :                  nub1=alpha(mub);nub2=beta(mub)
    1208         [ #  # ]:           0 :                  do mua=1,3
    1209                 :           0 :                    mu=mu0+(mua-1)+3*(mub-1)
    1210                 :           0 :                    buffer_i1 = zero
    1211         [ #  # ]:           0 :                    do ipw=1,npw
    1212                 :             :                      buffer_i1 = buffer_i1 + kpg(ipw,mua)*(scalari(ipw,1+nub1)*kpg(ipw,nub2) + &
    1213                 :           0 : &                     scalari(ipw,1+nub2)*kpg(ipw,nub1))
    1214                 :             :                    end do
    1215                 :           0 :                    d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_i1
    1216                 :             :                  end do
    1217                 :             :                end do
    1218                 :             :              else
    1219         [ #  # ]:           0 :                do mub=1,6
    1220                 :           0 :                  nub1=alpha(mub);nub2=beta(mub)
    1221         [ #  # ]:           0 :                  do mua=1,3
    1222                 :           0 :                    mu=mu0+(mua-1)+3*(mub-1)
    1223                 :           0 :                    buffer_r1 = zero
    1224         [ #  # ]:           0 :                    do ipw=1,npw
    1225                 :             :                      buffer_r1 = buffer_r1 + kpg(ipw,mua)*(scalarr(ipw,1+nub1)*kpg(ipw,nub2) + &
    1226                 :           0 : &                     scalarr(ipw,1+nub2)*kpg(ipw,nub1))
    1227                 :             :                    end do
    1228                 :           0 :                    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         [ -  + ]:        5376 :          ABI_FREE(scalarr)
    1235         [ -  + ]:        5376 :          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   [ +  +  +  + ]:    46693186 :        if ((signs==1).and.(choice_==6)) then
    1243                 :        5376 :          mu0=1
    1244   [ -  +  +  -  :       16128 :          ABI_MALLOC(scalarr,(npw,10))
          +  -  +  -  -  
                +  -  + ]
    1245   [ -  +  +  -  :       10752 :          ABI_MALLOC(scalari,(npw,10))
             -  +  -  + ]
    1246         [ +  + ]:       50432 :          do ilmn=1,nlmn
    1247                 :       45056 :            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
    1248         [ +  + ]:       45056 :            scale=wt;if (il>1) scale=-scale
    1249                 :       45056 :            scale2=quarter*scale
    1250         [ +  + ]:      495616 :            do mu=1,10
    1251         [ +  + ]:    95945856 :              do ipw=1,npw
    1252                 :    95450240 :                scalarr(ipw,mu)=scalr(ipw)*ffnl(ipw,mu,ilmn)
    1253                 :    95900800 :                scalari(ipw,mu)=scali(ipw)*ffnl(ipw,mu,ilmn)
    1254                 :             :              end do
    1255                 :             :            end do
    1256         [ +  - ]:       50432 :            if(cplex==2) then
    1257         [ +  + ]:      315392 :              do mub=1,6
    1258                 :      270336 :                nub1=alpha(mub);nub2=beta(mub)
    1259         [ +  + ]:     1937408 :                do mua=1,6
    1260                 :     1622016 :                  mu=mu0+(mua-1)+6*(mub-1)
    1261                 :     1622016 :                  nua1=alpha(mua);nua2=beta(mua)
    1262                 :     1622016 :                  gama=gamma(nub1,nua1)
    1263                 :     1622016 :                  gamb=gamma(nub2,nua1)
    1264                 :     1622016 :                  gamc=gamma(nub1,nua2)
    1265                 :     1622016 :                  gamd=gamma(nub2,nua2)
    1266                 :     1622016 :                  buffer_r1 = zero ; buffer_i1 = zero
    1267         [ +  + ]:   345242880 :                  do ipw=1,npw
    1268                 :   343620864 :                    kpga=kpg(ipw,nub1)
    1269                 :   343620864 :                    kpgb=kpg(ipw,nub2)
    1270                 :   343620864 :                    kpgc=kpg(ipw,nua1)
    1271                 :   343620864 :                    kpgd=kpg(ipw,nua2)
    1272                 :             :                    buffer_r1 = buffer_r1 + scalarr(ipw,4+gama)*kpgb*kpgd+scalarr(ipw,4+gamb)*kpga*kpgd &
    1273                 :   343620864 : &                   + 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                 :   345242880 : &                   + scalari(ipw,4+gamc)*kpgb*kpgc+scalari(ipw,4+gamd)*kpga*kpgc
    1276                 :             :                  end do
    1277         [ +  + ]:     1892352 :                  if (parity) then
    1278                 :      681984 :                    d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_r1
    1279                 :      681984 :                    d2gxdt(2,mu,ilmn,ia,ispinor) = scale2*buffer_i1
    1280                 :             :                  else
    1281                 :      940032 :                    d2gxdt(1,mu,ilmn,ia,ispinor) =-scale2*buffer_i1
    1282                 :      940032 :                    d2gxdt(2,mu,ilmn,ia,ispinor) = scale2*buffer_r1
    1283                 :             :                  end if
    1284                 :             :                end do
    1285                 :             :              end do
    1286                 :             :            else
    1287         [ #  # ]:           0 :              if (parity) then
    1288         [ #  # ]:           0 :                do mub=1,6
    1289                 :           0 :                  nub1=alpha(mub);nub2=beta(mub)
    1290         [ #  # ]:           0 :                  do mua=1,6
    1291                 :           0 :                    mu=mu0+(mua-1)+6*(mub-1)
    1292                 :           0 :                    nua1=alpha(mua);nua2=beta(mua)
    1293                 :           0 :                    gama=gamma(nub1,nua1)
    1294                 :           0 :                    gamb=gamma(nub2,nua1)
    1295                 :           0 :                    gamc=gamma(nub1,nua2)
    1296                 :           0 :                    gamd=gamma(nub2,nua2)
    1297                 :           0 :                    buffer_r1 = zero
    1298         [ #  # ]:           0 :                    do ipw=1,npw
    1299                 :           0 :                      kpga=kpg(ipw,nub1)
    1300                 :           0 :                      kpgb=kpg(ipw,nub2)
    1301                 :           0 :                      kpgc=kpg(ipw,nua1)
    1302                 :           0 :                      kpgd=kpg(ipw,nua2)
    1303                 :             :                      buffer_r1 = buffer_r1 + scalarr(ipw,4+gama)*kpgb*kpgd+scalarr(ipw,4+gamb)*kpga*kpgd &
    1304                 :           0 : &                     + scalarr(ipw,4+gamc)*kpgb*kpgc+scalarr(ipw,4+gamd)*kpga*kpgc
    1305                 :             :                    end do
    1306                 :           0 :                    d2gxdt(1,mu,ilmn,ia,ispinor) = scale2*buffer_r1
    1307                 :             :                  end do
    1308                 :             :                end do
    1309                 :             :              else
    1310         [ #  # ]:           0 :                do mub=1,6
    1311                 :           0 :                  nub1=alpha(mub);nub2=beta(mub)
    1312         [ #  # ]:           0 :                  do mua=1,6
    1313                 :           0 :                    mu=mu0+(mua-1)+6*(mub-1)
    1314                 :           0 :                    nua1=alpha(mua);nua2=beta(mua)
    1315                 :           0 :                    gama=gamma(nub1,nua1)
    1316                 :           0 :                    gamb=gamma(nub2,nua1)
    1317                 :           0 :                    gamc=gamma(nub1,nua2)
    1318                 :           0 :                    gamd=gamma(nub2,nua2)
    1319                 :           0 :                    buffer_i1 = zero
    1320         [ #  # ]:           0 :                    do ipw=1,npw
    1321                 :           0 :                      kpga=kpg(ipw,nub1)
    1322                 :           0 :                      kpgb=kpg(ipw,nub2)
    1323                 :           0 :                      kpgc=kpg(ipw,nua1)
    1324                 :           0 :                      kpgd=kpg(ipw,nua2)
    1325                 :             :                      buffer_i1 = buffer_i1 + scalari(ipw,4+gama)*kpgb*kpgd+scalari(ipw,4+gamb)*kpga*kpgd &
    1326                 :           0 : &                     + scalari(ipw,4+gamc)*kpgb*kpgc+scalari(ipw,4+gamd)*kpga*kpgc
    1327                 :             :                    end do
    1328                 :           0 :                    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         [ -  + ]:        5376 :          ABI_FREE(scalarr)
    1335         [ -  + ]:        5376 :          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   [ +  +  +  + ]:    46693186 :        if ((signs==1).and.(choice_==8.or.choice_==81)) then
    1343                 :       17280 :          mu0=1
    1344         [ +  + ]:       17280 :          do ilmn=1,nlmn
    1345                 :       15360 :            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
    1346         [ -  + ]:       15360 :            scale=wt;if (il>1) scale=-scale
    1347         [ +  - ]:       17280 :            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         [ +  + ]:     1463040 :              do ipw=1,npw
    1355                 :     1447680 :                buffer_ra = buffer_ra + scalr(ipw)*ffnl(ipw,5,ilmn)
    1356                 :     1447680 :                buffer_rb = buffer_rb + scalr(ipw)*ffnl(ipw,6,ilmn)
    1357                 :     1447680 :                buffer_rc = buffer_rc + scalr(ipw)*ffnl(ipw,7,ilmn)
    1358                 :     1447680 :                buffer_rd = buffer_rd + scalr(ipw)*ffnl(ipw,8,ilmn)
    1359                 :     1447680 :                buffer_re = buffer_re + scalr(ipw)*ffnl(ipw,9,ilmn)
    1360                 :     1447680 :                buffer_rf = buffer_rf + scalr(ipw)*ffnl(ipw,10,ilmn)
    1361                 :     1447680 :                buffer_ia = buffer_ia + scali(ipw)*ffnl(ipw,5,ilmn)
    1362                 :     1447680 :                buffer_ib = buffer_ib + scali(ipw)*ffnl(ipw,6,ilmn)
    1363                 :     1447680 :                buffer_ic = buffer_ic + scali(ipw)*ffnl(ipw,7,ilmn)
    1364                 :     1447680 :                buffer_id = buffer_id + scali(ipw)*ffnl(ipw,8,ilmn)
    1365                 :     1447680 :                buffer_ie = buffer_ie + scali(ipw)*ffnl(ipw,9,ilmn)
    1366                 :     1463040 :                buffer_if = buffer_if + scali(ipw)*ffnl(ipw,10,ilmn)
    1367                 :             :              end do
    1368         [ +  + ]:       15360 :              if (parity) then
    1369                 :        3840 :                d2gxdt(1,mu0  ,ilmn,ia,ispinor) = scale*buffer_ra
    1370                 :        3840 :                d2gxdt(2,mu0  ,ilmn,ia,ispinor) = scale*buffer_ia
    1371                 :        3840 :                d2gxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_rb
    1372                 :        3840 :                d2gxdt(2,mu0+1,ilmn,ia,ispinor) = scale*buffer_ib
    1373                 :        3840 :                d2gxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_rc
    1374                 :        3840 :                d2gxdt(2,mu0+2,ilmn,ia,ispinor) = scale*buffer_ic
    1375                 :        3840 :                d2gxdt(1,mu0+3,ilmn,ia,ispinor) = scale*buffer_rd
    1376                 :        3840 :                d2gxdt(2,mu0+3,ilmn,ia,ispinor) = scale*buffer_id
    1377                 :        3840 :                d2gxdt(1,mu0+4,ilmn,ia,ispinor) = scale*buffer_re
    1378                 :        3840 :                d2gxdt(2,mu0+4,ilmn,ia,ispinor) = scale*buffer_ie
    1379                 :        3840 :                d2gxdt(1,mu0+5,ilmn,ia,ispinor) = scale*buffer_rf
    1380                 :        3840 :                d2gxdt(2,mu0+5,ilmn,ia,ispinor) = scale*buffer_if
    1381                 :             :              else
    1382                 :       11520 :                d2gxdt(1,mu0  ,ilmn,ia,ispinor) =-scale*buffer_ia
    1383                 :       11520 :                d2gxdt(2,mu0  ,ilmn,ia,ispinor) = scale*buffer_ra
    1384                 :       11520 :                d2gxdt(1,mu0+1,ilmn,ia,ispinor) =-scale*buffer_ib
    1385                 :       11520 :                d2gxdt(2,mu0+1,ilmn,ia,ispinor) = scale*buffer_rb
    1386                 :       11520 :                d2gxdt(1,mu0+2,ilmn,ia,ispinor) =-scale*buffer_ic
    1387                 :       11520 :                d2gxdt(2,mu0+2,ilmn,ia,ispinor) = scale*buffer_rc
    1388                 :       11520 :                d2gxdt(1,mu0+3,ilmn,ia,ispinor) =-scale*buffer_id
    1389                 :       11520 :                d2gxdt(2,mu0+3,ilmn,ia,ispinor) = scale*buffer_rd
    1390                 :       11520 :                d2gxdt(1,mu0+4,ilmn,ia,ispinor) =-scale*buffer_ie
    1391                 :       11520 :                d2gxdt(2,mu0+4,ilmn,ia,ispinor) = scale*buffer_re
    1392                 :       11520 :                d2gxdt(1,mu0+5,ilmn,ia,ispinor) =-scale*buffer_if
    1393                 :       11520 :                d2gxdt(2,mu0+5,ilmn,ia,ispinor) = scale*buffer_rf
    1394                 :             :              end if
    1395                 :             :            else
    1396         [ #  # ]:           0 :              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         [ #  # ]:           0 :                do ipw=1,npw
    1401                 :           0 :                  buffer_ra = buffer_ra + scalr(ipw)*ffnl(ipw,5,ilmn)
    1402                 :           0 :                  buffer_rb = buffer_rb + scalr(ipw)*ffnl(ipw,6,ilmn)
    1403                 :           0 :                  buffer_rc = buffer_rc + scalr(ipw)*ffnl(ipw,7,ilmn)
    1404                 :           0 :                  buffer_rd = buffer_rd + scalr(ipw)*ffnl(ipw,8,ilmn)
    1405                 :           0 :                  buffer_re = buffer_re + scalr(ipw)*ffnl(ipw,9,ilmn)
    1406                 :           0 :                  buffer_rf = buffer_rf + scalr(ipw)*ffnl(ipw,10,ilmn)
    1407                 :             :                end do
    1408                 :           0 :                d2gxdt(1,mu0  ,ilmn,ia,ispinor) = scale*buffer_ra
    1409                 :           0 :                d2gxdt(1,mu0+1,ilmn,ia,ispinor) = scale*buffer_rb
    1410                 :           0 :                d2gxdt(1,mu0+2,ilmn,ia,ispinor) = scale*buffer_rc
    1411                 :           0 :                d2gxdt(1,mu0+3,ilmn,ia,ispinor) = scale*buffer_rd
    1412                 :           0 :                d2gxdt(1,mu0+4,ilmn,ia,ispinor) = scale*buffer_re
    1413                 :           0 :                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         [ #  # ]:           0 :                do ipw=1,npw
    1419                 :           0 :                  buffer_ia = buffer_ia + scali(ipw)*ffnl(ipw,5,ilmn)
    1420                 :           0 :                  buffer_ib = buffer_ib + scali(ipw)*ffnl(ipw,6,ilmn)
    1421                 :           0 :                  buffer_ic = buffer_ic + scali(ipw)*ffnl(ipw,7,ilmn)
    1422                 :           0 :                  buffer_id = buffer_id + scali(ipw)*ffnl(ipw,8,ilmn)
    1423                 :           0 :                  buffer_ie = buffer_ie + scali(ipw)*ffnl(ipw,9,ilmn)
    1424                 :           0 :                  buffer_if = buffer_if + scali(ipw)*ffnl(ipw,10,ilmn)
    1425                 :             :                end do
    1426                 :           0 :                d2gxdt(1,mu0  ,ilmn,ia,ispinor) =-scale*buffer_ia
    1427                 :           0 :                d2gxdt(1,mu0+1,ilmn,ia,ispinor) =-scale*buffer_ib
    1428                 :           0 :                d2gxdt(1,mu0+2,ilmn,ia,ispinor) =-scale*buffer_ic
    1429                 :           0 :                d2gxdt(1,mu0+3,ilmn,ia,ispinor) =-scale*buffer_id
    1430                 :           0 :                d2gxdt(1,mu0+4,ilmn,ia,ispinor) =-scale*buffer_ie
    1431                 :           0 :                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   [ +  +  +  + ]:    79750756 :        if ((signs==2).and.(choice_==8.or.choice_==81)) then
    1442                 :      108345 :          mu0=1
    1443                 :             :          !idir= (xx=1, xy=2, xz=3, yx=4, yy=5, yz=6, zx=7, zy=8, zz=9)
    1444                 :      108345 :          mua=idir1(idir);mub=idir2(idir)
    1445                 :             :          !idir->(Voigt) (11->1,22->2,33->3,32->4,31->5,21->6)
    1446                 :      108345 :          ffnl_dir(1)=gamma(mua,mub)
    1447         [ +  + ]:     1120728 :          do ilmn=1,nlmn
    1448                 :     1012383 :            il=mod(indlmn(1,ilmn),4);parity=(mod(il,2)==0)
    1449         [ +  + ]:     1012383 :            scale=wt;if (il>1) scale=-scale
    1450         [ +  - ]:     1120728 :            if (cplex==2) then
    1451                 :             :              buffer_r1 = zero ; buffer_i1 = zero
    1452         [ +  + ]:   167967180 :              do ipw=1,npw
    1453                 :   166954797 :                buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,4+ffnl_dir(1),ilmn)
    1454                 :   167967180 :                buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,4+ffnl_dir(1),ilmn)
    1455                 :             :              end do
    1456         [ +  + ]:     1012383 :              if (parity) then
    1457                 :      490473 :                d2gxdt(1,mu0,ilmn,ia,ispinor) = scale*buffer_r1
    1458                 :      490473 :                d2gxdt(2,mu0,ilmn,ia,ispinor) = scale*buffer_i1
    1459                 :             :              else
    1460                 :      521910 :                d2gxdt(1,mu0,ilmn,ia,ispinor) =-scale*buffer_i1
    1461                 :      521910 :                d2gxdt(2,mu0,ilmn,ia,ispinor) = scale*buffer_r1
    1462                 :             :              end if
    1463                 :             :            else
    1464         [ #  # ]:           0 :              if (parity) then
    1465                 :             :                buffer_r1 = zero
    1466         [ #  # ]:           0 :                do ipw=1,npw
    1467                 :           0 :                  buffer_r1 = buffer_r1 + scalr(ipw)*ffnl(ipw,4+ffnl_dir(1),ilmn)
    1468                 :             :                end do
    1469                 :           0 :                d2gxdt(1,mu0,ilmn,ia,ispinor) = scale*buffer_r1
    1470                 :             :              else
    1471                 :             :                buffer_i1 = zero
    1472         [ #  # ]:           0 :                do ipw=1,npw
    1473                 :           0 :                  buffer_i1 = buffer_i1 + scali(ipw)*ffnl(ipw,4+ffnl_dir(1),ilmn)
    1474                 :             :                end do
    1475                 :           0 :                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         [ -  + ]:    33057570 :      ABI_FREE(scali)
    1489         [ -  + ]:    63913278 :      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         [ +  + ]:    30855708 :  if (mpi_enreg%nproc_fft>1) then
    3126                 :      445964 :    call timab(48,1,tsec)
    3127         [ +  + ]:      445964 :    if (choice>=0) then
    3128                 :      443372 :      call xmpi_sum(gx,mpi_enreg%comm_fft,ierr)
    3129                 :             :    end if
    3130         [ +  + ]:      445964 :    if (choice_>1) then
    3131         [ +  - ]:       36192 :      if (ndgxdt>0) then
    3132                 :       36192 :        call xmpi_sum(dgxdt,mpi_enreg%comm_fft,ierr)
    3133                 :             :      end if
    3134         [ -  + ]:       36192 :      if (nd2gxdt>0) then
    3135                 :           0 :        call xmpi_sum(d2gxdt,mpi_enreg%comm_fft,ierr)
    3136                 :             :      end if
    3137                 :             :    end if
    3138                 :      445964 :    call timab(48,2,tsec)
    3139                 :             :  end if
    3140                 :             : 
    3141                 :             : end subroutine opernla_ylm
    3142                 :             : !!***
    3143                 :             : 
    3144                 :             : end module m_opernla_ylm
    3145                 :             : !!***
        

Generated by: LCOV version 2.3-1