LCOV - code coverage report
Current view: top level - src/66_nonlocal - m_contract.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 97.7 % 347 339
Test Date: 2026-09-21 22:40:37 Functions: 100.0 % 15 15

            Line data    Source code
       1              : !!****m* ABINIT/m_contract
       2              : !! NAME
       3              : !!  m_contract
       4              : !!
       5              : !! FUNCTION
       6              : !! Low-level procedeures used in nonlop_pl to contract tensors
       7              : !!
       8              : !! COPYRIGHT
       9              : !! Copyright (C) 1998-2026 ABINIT group (DCA, XG, MT, GZ)
      10              : !! This file is distributed under the terms of the
      11              : !! GNU General Public License, see ~abinit/COPYING
      12              : !! or http://www.gnu.org/copyleft/gpl.txt .
      13              : !!
      14              : !! SOURCE
      15              : 
      16              : #if defined HAVE_CONFIG_H
      17              : #include "config.h"
      18              : #endif
      19              : 
      20              : #include "abi_common.h"
      21              : 
      22              : module m_contract
      23              : 
      24              :  use defs_basis
      25              :  use m_errors
      26              : 
      27              :  implicit none
      28              : 
      29              :  private
      30              : !!***
      31              : 
      32              :  public :: cont22cso
      33              :  public :: cont22so
      34              :  public :: cont24
      35              :  public :: cont33cso
      36              :  public :: cont33so
      37              :  public :: cont35
      38              :  public :: cont22
      39              :  public :: cont3
      40              :  public :: cont13
      41              :  public :: metcon
      42              :  public :: metcon_so
      43              :  public :: metric_so
      44              : !!***
      45              : 
      46              : contains
      47              : !!***
      48              : 
      49              : !!****f* m_contract/cont13
      50              : !! NAME
      51              : !! cont13
      52              : !!
      53              : !! FUNCTION
      54              : !! Contract rank1 tensor with rank3 symmetric tensor to
      55              : !! produce symmetric rank2 tensor
      56              : !!
      57              : !! INPUTS
      58              : !!  rank1(2,3)=rank 1 complex tensor (vector of length 3)
      59              : !!  rank3(2,10)=rank 3 complex tensor (symmetric storage)
      60              : !!
      61              : !! OUTPUT
      62              : !!  rank2(6)=rank 2 real tensor (symmetric storage)
      63              : !!
      64              : !! NOTES
      65              : !! Tensors are in "symmetric" storage mode.
      66              : !! For rank1 this is 1, 2, 3;
      67              : !! for rank2 this is 11, 22, 33, 32, 31, 21;
      68              : !! for rank3 this is 111, 221, 331, 321, 311, 211, 222, 332, 322, 333.
      69              : !! rank1 and rank3 are complex; rank2 is real.
      70              : !! Want $2 Re[contraction]$.
      71              : !! $rank2(a,b)=2 Re[rank1(i)^"*" rank3(a,b,i)]$.
      72              : !! In typical usage the input rank1 tensor is actually
      73              : !! $rank1(i)=gmet(i,j) gxa(j)$
      74              : !!
      75              : !! SOURCE
      76              : 
      77       867129 : subroutine cont13(rank1,rank3,rank2)
      78              : 
      79              : !Arguments ------------------------------------
      80              : !arrays
      81              :  real(dp),intent(in) :: rank1(2,3),rank3(2,10)
      82              :  real(dp),intent(out) :: rank2(6)
      83              : 
      84              : !Local variables-------------------------------
      85              : !scalars
      86              :  integer,parameter :: im=2,re=1
      87              : 
      88              : ! *************************************************************************
      89              : 
      90              : !Simply write out index summations
      91              : !a=1, b=1 in rank2(a,b) --> maps to index 1
      92              :  rank2(1)=2.0d0*(&
      93              : & (rank1(re,1)*rank3(re,1)+rank1(im,1)*rank3(im,1))+&
      94              : & (rank1(re,2)*rank3(re,6)+rank1(im,2)*rank3(im,6))+&
      95       867129 : & (rank1(re,3)*rank3(re,5)+rank1(im,3)*rank3(im,5)))
      96              : 
      97              : !a=2, b=2 in rank2(a,b) --> maps to index 2
      98              :  rank2(2)=2.0d0*(&
      99              : & (rank1(re,1)*rank3(re,2)+rank1(im,1)*rank3(im,2))+&
     100              : & (rank1(re,2)*rank3(re,7)+rank1(im,2)*rank3(im,7))+&
     101       867129 : & (rank1(re,3)*rank3(re,9)+rank1(im,3)*rank3(im,9)))
     102              : 
     103              : !a=3, b=3 in rank2(a,b) --> maps to index 3
     104              :  rank2(3)=2.0d0*(&
     105              : & (rank1(re,1)*rank3(re,3)+rank1(im,1)*rank3(im,3))+&
     106              : & (rank1(re,2)*rank3(re,8)+rank1(im,2)*rank3(im,8))+&
     107       867129 : & (rank1(re,3)*rank3(re,10)+rank1(im,3)*rank3(im,10)))
     108              : 
     109              : !a=3, b=2 in rank2(a,b) --> maps to index 4
     110              :  rank2(4)=2.0d0*(&
     111              : & (rank1(re,1)*rank3(re,4)+rank1(im,1)*rank3(im,4))+&
     112              : & (rank1(re,2)*rank3(re,9)+rank1(im,2)*rank3(im,9))+&
     113       867129 : & (rank1(re,3)*rank3(re,8)+rank1(im,3)*rank3(im,8)))
     114              : 
     115              : !a=3, b=1 in rank2(a,b) --> maps to index 5
     116              :  rank2(5)=2.0d0*(&
     117              : & (rank1(re,1)*rank3(re,5)+rank1(im,1)*rank3(im,5))+&
     118              : & (rank1(re,2)*rank3(re,4)+rank1(im,2)*rank3(im,4))+&
     119       867129 : & (rank1(re,3)*rank3(re,3)+rank1(im,3)*rank3(im,3)))
     120              : 
     121              : !a=2, b=1 in rank2(a,b) --> maps to index 6
     122              :  rank2(6)=2.0d0*(&
     123              : & (rank1(re,1)*rank3(re,6)+rank1(im,1)*rank3(im,6))+&
     124              : & (rank1(re,2)*rank3(re,2)+rank1(im,2)*rank3(im,2))+&
     125       867129 : & (rank1(re,3)*rank3(re,4)+rank1(im,3)*rank3(im,4)))
     126              : 
     127       867129 : end subroutine cont13
     128              : !!***
     129              : 
     130              : 
     131              : !!****f* m_contract/cont22
     132              : !! NAME
     133              : !! cont22
     134              : !!
     135              : !! FUNCTION
     136              : !! Contract symmetric rank 2 tensor gxa with itself using gmet to
     137              : !! produce symmetric rank 2 tensor.
     138              : !!
     139              : !! INPUTS
     140              : !!  gxa(2,6)=rank 2 complex tensor
     141              : !!  gmet(3,3)=real symmetric metric tensor (full storage)
     142              : !!
     143              : !! OUTPUT
     144              : !!  rank2(6)=rank 2 real tensor (symmetric storage)
     145              : !!
     146              : !! NOTES
     147              : !! Symmetric gxa is stored as 11 22 33 32 31 21;
     148              : !! gmet(3,3) is symmetric but stored fully (9 elements);
     149              : !! output rank2 is stored as 11 22 33 32 31 21.
     150              : !! Want $2 Re[contraction]$.
     151              : !! $rank2(a,b)=2 Re[gxa(i,a)^"*" gmet(i,j) gxa(j,b)]$.
     152              : !!
     153              : !! SOURCE
     154              : 
     155       491121 : subroutine cont22(gxa,gmet,rank2)
     156              : 
     157              : !Arguments ------------------------------------
     158              : !arrays
     159              :  real(dp),intent(in) :: gmet(3,3),gxa(2,6)
     160              :  real(dp),intent(out) :: rank2(6)
     161              : 
     162              : !Local variables-------------------------------
     163              : !scalars
     164              :  integer,parameter :: im=2,re=1
     165              : 
     166              : ! *************************************************************************
     167              : 
     168              : !Simply write out index summations
     169              : !a=1, b=1 in rank2(a,b) --> maps to index 1
     170              :  rank2(1)=2.0d0*(&
     171              : & gmet(1,1)*(gxa(re,1)*gxa(re,1)+gxa(im,1)*gxa(im,1))+&
     172              : & gmet(2,2)*(gxa(re,6)*gxa(re,6)+gxa(im,6)*gxa(im,6))+&
     173              : & gmet(3,3)*(gxa(re,5)*gxa(re,5)+gxa(im,5)*gxa(im,5))+&
     174              : & 2.0d0*(&
     175              : & gmet(3,2)*(gxa(re,5)*gxa(re,6)+gxa(im,5)*gxa(im,6))+&
     176              : & gmet(3,1)*(gxa(re,5)*gxa(re,1)+gxa(im,5)*gxa(im,1))+&
     177       491121 : & gmet(2,1)*(gxa(re,6)*gxa(re,1)+gxa(im,6)*gxa(im,1))))
     178              : 
     179              : !a=2, b=2 in rank2(a,b) --> maps to index 2
     180              :  rank2(2)=2.0d0*(&
     181              : & gmet(1,1)*(gxa(re,6)*gxa(re,6)+gxa(im,6)*gxa(im,6))+&
     182              : & gmet(2,2)*(gxa(re,2)*gxa(re,2)+gxa(im,2)*gxa(im,2))+&
     183              : & gmet(3,3)*(gxa(re,4)*gxa(re,4)+gxa(im,4)*gxa(im,4))+&
     184              : & 2.0d0*(&
     185              : & gmet(3,2)*(gxa(re,4)*gxa(re,2)+gxa(im,4)*gxa(im,2))+&
     186              : & gmet(3,1)*(gxa(re,4)*gxa(re,6)+gxa(im,4)*gxa(im,6))+&
     187       491121 : & gmet(2,1)*(gxa(re,2)*gxa(re,6)+gxa(im,2)*gxa(im,6))))
     188              : 
     189              : !a=3, b=3 in rank2(a,b) --> maps to index 3
     190              :  rank2(3)=2.0d0*(&
     191              : & gmet(1,1)*(gxa(re,5)*gxa(re,5)+gxa(im,5)*gxa(im,5))+&
     192              : & gmet(2,2)*(gxa(re,4)*gxa(re,4)+gxa(im,4)*gxa(im,4))+&
     193              : & gmet(3,3)*(gxa(re,3)*gxa(re,3)+gxa(im,3)*gxa(im,3))+&
     194              : & 2.0d0*(&
     195              : & gmet(3,2)*(gxa(re,4)*gxa(re,3)+gxa(im,4)*gxa(im,3))+&
     196              : & gmet(3,1)*(gxa(re,5)*gxa(re,3)+gxa(im,5)*gxa(im,3))+&
     197       491121 : & gmet(2,1)*(gxa(re,5)*gxa(re,4)+gxa(im,5)*gxa(im,4))))
     198              : 
     199              : !a=3, b=2 in rank2(a,b) --> maps to index 4
     200              :  rank2(4)=2.0d0*(&
     201              : & gmet(1,1)*(gxa(re,5)*gxa(re,6)+gxa(im,5)*gxa(im,6))+&
     202              : & gmet(2,2)*(gxa(re,4)*gxa(re,2)+gxa(im,4)*gxa(im,2))+&
     203              : & gmet(3,3)*(gxa(re,3)*gxa(re,4)+gxa(im,3)*gxa(im,4))+&
     204              : & gmet(3,2)*(gxa(re,3)*gxa(re,2)+gxa(im,3)*gxa(im,2))+&
     205              : & gmet(3,1)*(gxa(re,3)*gxa(re,6)+gxa(im,3)*gxa(im,6))+&
     206              : & gmet(2,1)*(gxa(re,4)*gxa(re,6)+gxa(im,4)*gxa(im,6))+&
     207              : & gmet(2,3)*(gxa(re,4)*gxa(re,4)+gxa(im,4)*gxa(im,4))+&
     208              : & gmet(1,3)*(gxa(re,5)*gxa(re,4)+gxa(im,5)*gxa(im,4))+&
     209       491121 : & gmet(1,2)*(gxa(re,5)*gxa(re,2)+gxa(im,5)*gxa(im,2)))
     210              : 
     211              : !a=3, b=1 in rank2(a,b) --> maps to index 5
     212              :  rank2(5)=2.0d0*(&
     213              : & gmet(1,1)*(gxa(re,5)*gxa(re,1)+gxa(im,5)*gxa(im,1))+&
     214              : & gmet(2,2)*(gxa(re,4)*gxa(re,6)+gxa(im,4)*gxa(im,6))+&
     215              : & gmet(3,3)*(gxa(re,3)*gxa(re,5)+gxa(im,3)*gxa(im,5))+&
     216              : & gmet(3,2)*(gxa(re,3)*gxa(re,6)+gxa(im,3)*gxa(im,6))+&
     217              : & gmet(3,1)*(gxa(re,3)*gxa(re,1)+gxa(im,3)*gxa(im,1))+&
     218              : & gmet(2,1)*(gxa(re,4)*gxa(re,1)+gxa(im,4)*gxa(im,1))+&
     219              : & gmet(2,3)*(gxa(re,4)*gxa(re,5)+gxa(im,4)*gxa(im,5))+&
     220              : & gmet(1,3)*(gxa(re,5)*gxa(re,5)+gxa(im,5)*gxa(im,5))+&
     221       491121 : & gmet(1,2)*(gxa(re,5)*gxa(re,6)+gxa(im,5)*gxa(im,6)))
     222              : 
     223              : !a=2, b=1 in rank2(a,b) --> maps to index 6
     224              :  rank2(6)=2.0d0*(&
     225              : & gmet(1,1)*(gxa(re,6)*gxa(re,1)+gxa(im,6)*gxa(im,1))+&
     226              : & gmet(2,2)*(gxa(re,2)*gxa(re,6)+gxa(im,2)*gxa(im,6))+&
     227              : & gmet(3,3)*(gxa(re,4)*gxa(re,5)+gxa(im,4)*gxa(im,5))+&
     228              : & gmet(3,2)*(gxa(re,4)*gxa(re,6)+gxa(im,4)*gxa(im,6))+&
     229              : & gmet(3,1)*(gxa(re,4)*gxa(re,1)+gxa(im,4)*gxa(im,1))+&
     230              : & gmet(2,1)*(gxa(re,2)*gxa(re,1)+gxa(im,2)*gxa(im,1))+&
     231              : & gmet(2,3)*(gxa(re,2)*gxa(re,5)+gxa(im,2)*gxa(im,5))+&
     232              : & gmet(1,3)*(gxa(re,6)*gxa(re,5)+gxa(im,6)*gxa(im,5))+&
     233       491121 : & gmet(1,2)*(gxa(re,6)*gxa(re,6)+gxa(im,6)*gxa(im,6)))
     234              : 
     235       491121 : end subroutine cont22
     236              : !!***
     237              : 
     238              : !!****f* m_contract/cont22cso
     239              : !! NAME
     240              : !! cont22cso
     241              : !!
     242              : !! FUNCTION
     243              : !! Contract symmetric rank 2 tensor gxa1 with symmetric rank 2 tensor
     244              : !! gxa2 using metric tensor gmet to produce rank 2 complex tensor.
     245              : !!
     246              : !! INPUTS
     247              : !!  gxa1(2,10)=rank 2 complex symmetric tensor
     248              : !!  gxa2(2,10)=rank 2 complex symmetric tensor
     249              : !!  gmet(3,3)=usual metric tensor (symmetric, real)
     250              : !!
     251              : !! OUTPUT
     252              : !!  rank2c(2,6)=rank 2 complex tensor (pseudo-symmetric storage)
     253              : !!
     254              : !! NOTES
     255              : !! This contraction is used for spin-orbit correction in non-local
     256              : !! contribution to stresses.
     257              : !!
     258              : !! Symmetric gxa1, gxa2 are stored as 11 22 33 32 31 21;
     259              : !! gmet(3,3) is symmetric but stored fully (9 elements);
     260              : !! Output rank2c is not symmetric but since
     261              : !!      $rank2c_{gxa1,gxa2}(a,b)=conjg(rank2c_{gxa2,gxa1}(b,a))$
     262              : !!       it is stored as 11 22 33 32 31 21.
     263              : !!
     264              : !! rank2c(1,1), rank2c(2,2), rank3c(3,3) are not needed;
     265              : !! They are not calculated.
     266              : !!
     267              : !!{{\ \begin{equation}
     268              : !! rank2c(a,b)=3 conjg(gxa1(i,a)) gmet(i,j) gxa2(j,b)
     269              : !!\end{equation} }}
     270              : !!
     271              : !! SOURCE
     272              : 
     273       285896 : subroutine cont22cso(gxa1,gxa2,gmet,rank2c)
     274              : 
     275              : !Arguments ------------------------------------
     276              : !arrays
     277              :  real(dp),intent(in) :: gmet(3,3),gxa1(2,6),gxa2(2,6)
     278              :  real(dp),intent(out) :: rank2c(2,6)
     279              : 
     280              : !Local variables-------------------------------
     281              : !scalars
     282              :  integer,parameter :: im=2,re=1
     283              : !arrays
     284              :  real(dp) :: r2(2,3,3)
     285              : 
     286              : ! *************************************************************************
     287              : 
     288              : !Initialize output tensor
     289       285896 :  rank2c(:,:)=0.d0
     290              : 
     291              : !First compute r2(i,j) = gmet(i,k) gxa2(j,k)
     292       857688 :  r2(:,1,1)=gmet(1,1)*gxa2(:,1)+gmet(1,2)*gxa2(:,6)+gmet(1,3)*gxa2(:,5)
     293       857688 :  r2(:,1,2)=gmet(1,1)*gxa2(:,6)+gmet(1,2)*gxa2(:,2)+gmet(1,3)*gxa2(:,4)
     294              :  r2(:,1,3)=gmet(1,1)*gxa2(:,5)+gmet(1,2)*gxa2(:,4)+gmet(1,3)*gxa2(:,3)
     295       857688 :  r2(:,2,1)=gmet(2,1)*gxa2(:,1)+gmet(2,2)*gxa2(:,6)+gmet(2,3)*gxa2(:,5)
     296       857688 :  r2(:,2,2)=gmet(2,1)*gxa2(:,6)+gmet(2,2)*gxa2(:,2)+gmet(2,3)*gxa2(:,4)
     297              :  r2(:,2,3)=gmet(2,1)*gxa2(:,5)+gmet(2,2)*gxa2(:,4)+gmet(2,3)*gxa2(:,3)
     298       857688 :  r2(:,3,1)=gmet(3,1)*gxa2(:,1)+gmet(3,2)*gxa2(:,6)+gmet(3,3)*gxa2(:,5)
     299       857688 :  r2(:,3,2)=gmet(3,1)*gxa2(:,6)+gmet(3,2)*gxa2(:,2)+gmet(3,3)*gxa2(:,4)
     300              :  r2(:,3,3)=gmet(3,1)*gxa2(:,5)+gmet(3,2)*gxa2(:,4)+gmet(3,3)*gxa2(:,3)
     301              : 
     302              : !Then compute rank2c(a,b) = 3 conjg(gxa1(a,i)) r2(i,b)
     303              : !stored as 11 22 33 32 31 21
     304              : !rank2c(re,1) = 3.d0*(gxa1(re,1)*r2(re,1,1)+gxa1(im,1)*r2(im,1,1)&
     305              : !&                     +gxa1(re,6)*r2(re,2,1)+gxa1(im,6)*r2(im,2,1)&
     306              : !&                     +gxa1(re,5)*r2(re,3,1)+gxa1(im,5)*r2(im,3,1))
     307              : !rank2c(re,2) = 3.d0*(gxa1(re,6)*r2(re,1,2)+gxa1(im,6)*r2(im,1,2)&
     308              : !&                     +gxa1(re,2)*r2(re,2,2)+gxa1(im,2)*r2(im,2,2)&
     309              : !&                     +gxa1(re,4)*r2(re,3,2)+gxa1(im,4)*r2(im,3,2))
     310              : !rank2c(re,3) = 3.d0*(gxa1(re,5)*r2(re,1,3)+gxa1(im,5)*r2(im,1,3)&
     311              : !&                     +gxa1(re,4)*r2(re,2,3)+gxa1(im,4)*r2(im,2,3)&
     312              : !&                     +gxa1(re,3)*r2(re,3,3)+gxa1(im,3)*r2(im,3,3))
     313              :  rank2c(re,4) = 3.d0*(gxa1(re,5)*r2(re,1,2)+gxa1(im,5)*r2(im,1,2)&
     314              : & +gxa1(re,4)*r2(re,2,2)+gxa1(im,4)*r2(im,2,2)&
     315       285896 : & +gxa1(re,3)*r2(re,3,2)+gxa1(im,3)*r2(im,3,2))
     316              :  rank2c(re,5) = 3.d0*(gxa1(re,5)*r2(re,1,1)+gxa1(im,5)*r2(im,1,1)&
     317              : & +gxa1(re,4)*r2(re,2,1)+gxa1(im,4)*r2(im,2,1)&
     318       285896 : & +gxa1(re,3)*r2(re,3,1)+gxa1(im,3)*r2(im,3,1))
     319              :  rank2c(re,6) = 3.d0*(gxa1(re,6)*r2(re,1,1)+gxa1(im,6)*r2(im,1,1)&
     320              : & +gxa1(re,2)*r2(re,2,1)+gxa1(im,2)*r2(im,2,1)&
     321       285896 : & +gxa1(re,4)*r2(re,3,1)+gxa1(im,4)*r2(im,3,1))
     322              : !rank2c(im,1) = 3.d0*(gxa1(re,1)*r2(im,1,1)-gxa1(im,1)*r2(re,1,1)&
     323              : !&                     +gxa1(re,6)*r2(im,2,1)-gxa1(im,6)*r2(re,2,1)&
     324              : !&                     +gxa1(re,5)*r2(im,3,1)-gxa1(im,5)*r2(re,3,1))
     325              : !rank2c(im,2) = 3.d0*(gxa1(re,6)*r2(im,1,2)-gxa1(im,6)*r2(re,1,2)&
     326              : !&                     +gxa1(re,2)*r2(im,2,2)-gxa1(im,2)*r2(re,2,2)&
     327              : !&                     +gxa1(re,4)*r2(im,3,2)-gxa1(im,4)*r2(re,3,2))
     328              : !rank2c(im,3) = 3.d0*(gxa1(re,5)*r2(im,1,3)-gxa1(im,5)*r2(re,1,3)&
     329              : !&                     +gxa1(re,4)*r2(im,2,3)-gxa1(im,4)*r2(re,2,3)&
     330              : !&                     +gxa1(re,3)*r2(im,3,3)-gxa1(im,3)*r2(re,3,3))
     331              :  rank2c(im,4) = 3.d0*(gxa1(re,5)*r2(im,1,2)-gxa1(im,5)*r2(re,1,2)&
     332              : & +gxa1(re,4)*r2(im,2,2)-gxa1(im,4)*r2(re,2,2)&
     333       285896 : & +gxa1(re,3)*r2(im,3,2)-gxa1(im,3)*r2(re,3,2))
     334              :  rank2c(im,5) = 3.d0*(gxa1(re,5)*r2(im,1,1)-gxa1(im,5)*r2(re,1,1)&
     335              : & +gxa1(re,4)*r2(im,2,1)-gxa1(im,4)*r2(re,2,1)&
     336       285896 : & +gxa1(re,3)*r2(im,3,1)-gxa1(im,3)*r2(re,3,1))
     337              :  rank2c(im,6) = 3.d0*(gxa1(re,6)*r2(im,1,1)-gxa1(im,6)*r2(re,1,1)&
     338              : & +gxa1(re,2)*r2(im,2,1)-gxa1(im,2)*r2(re,2,1)&
     339       285896 : & +gxa1(re,4)*r2(im,3,1)-gxa1(im,4)*r2(re,3,1))
     340              : 
     341       285896 : end subroutine cont22cso
     342              : !!***
     343              : 
     344              : 
     345              : !!****f* m_contract/cont22so
     346              : !! NAME
     347              : !! cont22so
     348              : !!
     349              : !! FUNCTION
     350              : !! Contract symmetric rank 2 tensor gxa1 with symmetric rank 2 tensor
     351              : !! gxa2 using antisymmetric tensor amet to produce rank 2 real tensor.
     352              : !!
     353              : !! INPUTS
     354              : !!  gxa1(2,6)=rank 2 complex symmetric tensor
     355              : !!  gxa2(2,6)=rank 2 complex symmetric tensor
     356              : !!  amet(2,3,3)=antisymmetric complex tensor used for spin-orbit
     357              : !!
     358              : !! OUTPUT
     359              : !!  rank2(6)=rank 2 real tensor (pseudo-symmetric storage)
     360              : !!
     361              : !! NOTES
     362              : !! This contraction is used for spin-orbit correction in non-local
     363              : !! contribution to stresses.
     364              : !!
     365              : !! Symmetric gxa1, gxa2 are stored as 11 22 33 32 31 21;
     366              : !! amet(3,3) is antisymmetric but stored fully (9 elements);
     367              : !! Output rank2 is not symmetric but since
     368              : !!      $rank2_{gxa1,gxa2}(a,b)=conjg(rank2_{gxa2,gxa1}(b,a))$
     369              : !!       it is stored as 11 22 33 32 31 21.
     370              : !! Want 2*Re[contraction].
     371              : !!
     372              : !!{{\ \begin{equation}
     373              : !! rank2(a,b)=2 Re[conjg(gxa1(i,a)) amet(i,j) gxa2(j,b)]
     374              : !!\end{equation} }}
     375              : !!
     376              : !! Note that, since amet is antisymmetric, amet(i,i)=0
     377              : !!
     378              : !! SOURCE
     379              : 
     380       285896 : subroutine cont22so(gxa1,gxa2,amet,rank2)
     381              : 
     382              : !Arguments ------------------------------------
     383              : !arrays
     384              :  real(dp),intent(in) :: amet(2,3,3),gxa1(2,6),gxa2(2,6)
     385              :  real(dp),intent(out) :: rank2(6)
     386              : 
     387              : !Local variables-------------------------------
     388              : !scalars
     389              :  integer,parameter :: im=2,re=1
     390              : 
     391              : ! *************************************************************************
     392              : 
     393              : !Simply write out index summations
     394              : !a=1, b=1 in rank2(a,b) --> maps to index 1
     395              :  rank2(1)=2.0d0*(&
     396              : & amet(1,3,2)*(gxa1(re,5)*gxa2(re,6)+gxa1(im,5)*gxa2(im,6))-&
     397              : & amet(2,3,2)*(gxa1(re,5)*gxa2(im,6)-gxa1(im,5)*gxa2(re,6))+&
     398              : & amet(1,3,1)*(gxa1(re,5)*gxa2(re,1)+gxa1(im,5)*gxa2(im,1))-&
     399              : & amet(2,3,1)*(gxa1(re,5)*gxa2(im,1)-gxa1(im,5)*gxa2(re,1))+&
     400              : & amet(1,2,1)*(gxa1(re,6)*gxa2(re,1)+gxa1(im,6)*gxa2(im,1))-&
     401              : & amet(2,2,1)*(gxa1(re,6)*gxa2(im,1)-gxa1(im,6)*gxa2(re,1))+&
     402              : & amet(1,2,3)*(gxa1(re,6)*gxa2(re,5)+gxa1(im,6)*gxa2(im,5))-&
     403              : & amet(2,2,3)*(gxa1(re,6)*gxa2(im,5)-gxa1(im,6)*gxa2(re,5))+&
     404              : & amet(1,1,3)*(gxa1(re,1)*gxa2(re,5)+gxa1(im,1)*gxa2(im,5))-&
     405              : & amet(2,1,3)*(gxa1(re,1)*gxa2(im,5)-gxa1(im,1)*gxa2(re,5))+&
     406              : & amet(1,1,2)*(gxa1(re,1)*gxa2(re,6)+gxa1(im,1)*gxa2(im,6))-&
     407       285896 : & amet(2,1,2)*(gxa1(re,1)*gxa2(im,6)-gxa1(im,1)*gxa2(re,6)))
     408              : 
     409              : !a=2, b=2 in rank2(a,b) --> maps to index 2
     410              :  rank2(2)=2.0d0*(&
     411              : & amet(1,3,2)*(gxa1(re,4)*gxa2(re,2)+gxa1(im,4)*gxa2(im,2))-&
     412              : & amet(2,3,2)*(gxa1(re,4)*gxa2(im,2)-gxa1(im,4)*gxa2(re,2))+&
     413              : & amet(1,3,1)*(gxa1(re,4)*gxa2(re,6)+gxa1(im,4)*gxa2(im,6))-&
     414              : & amet(2,3,1)*(gxa1(re,4)*gxa2(im,6)-gxa1(im,4)*gxa2(re,6))+&
     415              : & amet(1,2,1)*(gxa1(re,2)*gxa2(re,6)+gxa1(im,2)*gxa2(im,6))-&
     416              : & amet(2,2,1)*(gxa1(re,2)*gxa2(im,6)-gxa1(im,2)*gxa2(re,6))+&
     417              : & amet(1,2,3)*(gxa1(re,2)*gxa2(re,4)+gxa1(im,2)*gxa2(im,4))-&
     418              : & amet(2,2,3)*(gxa1(re,2)*gxa2(im,4)-gxa1(im,2)*gxa2(re,4))+&
     419              : & amet(1,1,3)*(gxa1(re,6)*gxa2(re,4)+gxa1(im,6)*gxa2(im,4))-&
     420              : & amet(2,1,3)*(gxa1(re,6)*gxa2(im,4)-gxa1(im,6)*gxa2(re,4))+&
     421              : & amet(1,1,2)*(gxa1(re,6)*gxa2(re,2)+gxa1(im,6)*gxa2(im,2))-&
     422       285896 : & amet(2,1,2)*(gxa1(re,6)*gxa2(im,2)-gxa1(im,6)*gxa2(re,2)))
     423              : 
     424              : !a=3, b=3 in rank2(a,b) --> maps to index 3
     425              :  rank2(3)=2.0d0*(&
     426              : & amet(1,3,2)*(gxa1(re,3)*gxa2(re,4)+gxa1(im,3)*gxa2(im,4))-&
     427              : & amet(2,3,2)*(gxa1(re,3)*gxa2(im,4)-gxa1(im,3)*gxa2(re,4))+&
     428              : & amet(1,3,1)*(gxa1(re,3)*gxa2(re,5)+gxa1(im,3)*gxa2(im,5))-&
     429              : & amet(2,3,1)*(gxa1(re,3)*gxa2(im,5)-gxa1(im,3)*gxa2(re,5))+&
     430              : & amet(1,2,1)*(gxa1(re,4)*gxa2(re,5)+gxa1(im,4)*gxa2(im,5))-&
     431              : & amet(2,2,1)*(gxa1(re,4)*gxa2(im,5)-gxa1(im,4)*gxa2(re,5))+&
     432              : & amet(1,2,3)*(gxa1(re,4)*gxa2(re,3)+gxa1(im,4)*gxa2(im,3))-&
     433              : & amet(2,2,3)*(gxa1(re,4)*gxa2(im,3)-gxa1(im,4)*gxa2(re,3))+&
     434              : & amet(1,1,3)*(gxa1(re,5)*gxa2(re,3)+gxa1(im,5)*gxa2(im,3))-&
     435              : & amet(2,1,3)*(gxa1(re,5)*gxa2(im,3)-gxa1(im,5)*gxa2(re,3))+&
     436              : & amet(1,1,2)*(gxa1(re,5)*gxa2(re,4)+gxa1(im,5)*gxa2(im,4))-&
     437       285896 : & amet(2,1,2)*(gxa1(re,5)*gxa2(im,4)-gxa1(im,5)*gxa2(re,4)))
     438              : 
     439              : !a=3, b=2 in rank2(a,b) --> maps to index 4
     440              :  rank2(4)=2.0d0*(&
     441              : & amet(1,3,2)*(gxa1(re,3)*gxa2(re,2)+gxa1(im,3)*gxa2(im,2))-&
     442              : & amet(2,3,2)*(gxa1(re,3)*gxa2(im,2)-gxa1(im,3)*gxa2(re,2))+&
     443              : & amet(1,3,1)*(gxa1(re,3)*gxa2(re,6)+gxa1(im,3)*gxa2(im,6))-&
     444              : & amet(2,3,1)*(gxa1(re,3)*gxa2(im,6)-gxa1(im,3)*gxa2(re,6))+&
     445              : & amet(1,2,1)*(gxa1(re,4)*gxa2(re,6)+gxa1(im,4)*gxa2(im,6))-&
     446              : & amet(2,2,1)*(gxa1(re,4)*gxa2(im,6)-gxa1(im,4)*gxa2(re,6))+&
     447              : & amet(1,2,3)*(gxa1(re,4)*gxa2(re,4)+gxa1(im,4)*gxa2(im,4))-&
     448              : & amet(2,2,3)*(gxa1(re,4)*gxa2(im,4)-gxa1(im,4)*gxa2(re,4))+&
     449              : & amet(1,1,3)*(gxa1(re,5)*gxa2(re,4)+gxa1(im,5)*gxa2(im,4))-&
     450              : & amet(2,1,3)*(gxa1(re,5)*gxa2(im,4)-gxa1(im,5)*gxa2(re,4))+&
     451              : & amet(1,1,2)*(gxa1(re,5)*gxa2(re,2)+gxa1(im,5)*gxa2(im,2))-&
     452       285896 : & amet(2,1,2)*(gxa1(re,5)*gxa2(im,2)-gxa1(im,5)*gxa2(re,2)))
     453              : 
     454              : !a=3, b=1 in rank2(a,b) --> maps to index 5
     455              :  rank2(5)=2.0d0*(&
     456              : & amet(1,3,2)*(gxa1(re,3)*gxa2(re,6)+gxa1(im,3)*gxa2(im,6))-&
     457              : & amet(2,3,2)*(gxa1(re,3)*gxa2(im,6)-gxa1(im,3)*gxa2(re,6))+&
     458              : & amet(1,3,1)*(gxa1(re,3)*gxa2(re,1)+gxa1(im,3)*gxa2(im,1))-&
     459              : & amet(2,3,1)*(gxa1(re,3)*gxa2(im,1)-gxa1(im,3)*gxa2(re,1))+&
     460              : & amet(1,2,1)*(gxa1(re,4)*gxa2(re,1)+gxa1(im,4)*gxa2(im,1))-&
     461              : & amet(2,2,1)*(gxa1(re,4)*gxa2(im,1)-gxa1(im,4)*gxa2(re,1))+&
     462              : & amet(1,2,3)*(gxa1(re,4)*gxa2(re,5)+gxa1(im,4)*gxa2(im,5))-&
     463              : & amet(2,2,3)*(gxa1(re,4)*gxa2(im,5)-gxa1(im,4)*gxa2(re,5))+&
     464              : & amet(1,1,3)*(gxa1(re,5)*gxa2(re,5)+gxa1(im,5)*gxa2(im,5))-&
     465              : & amet(2,1,3)*(gxa1(re,5)*gxa2(im,5)-gxa1(im,5)*gxa2(re,5))+&
     466              : & amet(1,1,2)*(gxa1(re,5)*gxa2(re,6)+gxa1(im,5)*gxa2(im,6))-&
     467       285896 : & amet(2,1,2)*(gxa1(re,5)*gxa2(im,6)-gxa1(im,5)*gxa2(re,6)))
     468              : 
     469              : !a=2, b=1 in rank2(a,b) --> maps to index 6
     470              :  rank2(6)=2.0d0*(&
     471              : & amet(1,3,2)*(gxa1(re,4)*gxa2(re,6)+gxa1(im,4)*gxa2(im,6))-&
     472              : & amet(2,3,2)*(gxa1(re,4)*gxa2(im,6)-gxa1(im,4)*gxa2(re,6))+&
     473              : & amet(1,3,1)*(gxa1(re,4)*gxa2(re,1)+gxa1(im,4)*gxa2(im,1))-&
     474              : & amet(2,3,1)*(gxa1(re,4)*gxa2(im,1)-gxa1(im,4)*gxa2(re,1))+&
     475              : & amet(1,2,1)*(gxa1(re,2)*gxa2(re,1)+gxa1(im,2)*gxa2(im,1))-&
     476              : & amet(2,2,1)*(gxa1(re,2)*gxa2(im,1)-gxa1(im,2)*gxa2(re,1))+&
     477              : & amet(1,2,3)*(gxa1(re,2)*gxa2(re,5)+gxa1(im,2)*gxa2(im,5))-&
     478              : & amet(2,2,3)*(gxa1(re,2)*gxa2(im,5)-gxa1(im,2)*gxa2(re,5))+&
     479              : & amet(1,1,3)*(gxa1(re,6)*gxa2(re,5)+gxa1(im,6)*gxa2(im,5))-&
     480              : & amet(2,1,3)*(gxa1(re,6)*gxa2(im,5)-gxa1(im,6)*gxa2(re,5))+&
     481              : & amet(1,1,2)*(gxa1(re,6)*gxa2(re,6)+gxa1(im,6)*gxa2(im,6))-&
     482       285896 : & amet(2,1,2)*(gxa1(re,6)*gxa2(im,6)-gxa1(im,6)*gxa2(re,6)))
     483              : 
     484       285896 : end subroutine cont22so
     485              : !!***
     486              : 
     487              : 
     488              : !!****f* m_contract/cont24
     489              : !! NAME
     490              : !! cont24
     491              : !!
     492              : !! FUNCTION
     493              : !! Contract symmetric rank2 tensor gxa with rank4 symmetric tensor to
     494              : !! produce symmetric rank2 tensor.
     495              : !!
     496              : !! INPUTS
     497              : !!  gxa(2,6)=rank 2 symmetric complex tensor in order 11 22 33 32 31 21
     498              : !!  rank4(2,15)=rank 4 complex tensor (symmetric storage)
     499              : !!
     500              : !! OUTPUT
     501              : !!  rank2(6)=rank 2 real tensor (symmetric storage) 11 22 33 32 31 21.
     502              : !!
     503              : !! NOTES
     504              : !! Tensors are in "symmetric" storage mode.
     505              : !! for gxa and rank2 this is 11, 22, 33, 32, 31, 21;
     506              : !! for the rank 4 tensor rank4 this is
     507              : !! 1111 2211 3311 3211 3111 2111 2221 3321 3221 3331 2222 3322 3222 3332 3333.
     508              : !! gxa and rank4 are complex; rank2 is real.
     509              : !! Want $2 Re[contraction]$.
     510              : !! $rank2(a,b)=2 Re[gxa(i,j)^"*" rank4(a,b,i,j)]$.
     511              : !!
     512              : !! Note that the input gxa is typically the result of
     513              : !! $gxa(i,j)=[{3 \over 2} gmet(i,l) gmet(j,m) - {1 \over 2} gmet(i,j) gmet(l,m)] gxa_old(l,m)$
     514              : !! where the subroutine "metcon" already includes weights in the
     515              : !! definition of gxa for off-diagonal elements (weight of 2 for
     516              : !! symmetry).
     517              : !! Components 4, 5, and 6 of gxa have already been multiplied by 2
     518              : !! so the expressions below do not carry the 2.
     519              : !!
     520              : !! SOURCE
     521              : 
     522       634069 : subroutine cont24(gxa,rank4,rank2)
     523              : 
     524              : !Arguments ------------------------------------
     525              : !arrays
     526              :  real(dp),intent(in) :: gxa(2,6),rank4(2,15)
     527              :  real(dp),intent(out) :: rank2(6)
     528              : 
     529              : !Local variables-------------------------------
     530              : !scalars
     531              :  integer,parameter :: im=2,re=1
     532              : 
     533              : ! *************************************************************************
     534              : 
     535              : !Simply write out index summations
     536              : 
     537              : !a=1, b=1 in rank2(a,b) --> maps to index 1
     538              :  rank2(1)=2.0d0*(&
     539              : & gxa(re,1)*rank4(re, 1)+gxa(im,1)*rank4(im, 1)+&
     540              : & gxa(re,2)*rank4(re, 2)+gxa(im,2)*rank4(im, 2)+&
     541              : & gxa(re,3)*rank4(re, 3)+gxa(im,3)*rank4(im, 3)+&
     542              : & gxa(re,4)*rank4(re, 4)+gxa(im,4)*rank4(im, 4)+&
     543              : & gxa(re,5)*rank4(re, 5)+gxa(im,5)*rank4(im, 5)+&
     544       634069 : & gxa(re,6)*rank4(re, 6)+gxa(im,6)*rank4(im, 6))
     545              : 
     546              : !a=2, b=2 in rank2(a,b) --> maps to index 2
     547              :  rank2(2)=2.0d0*(&
     548              : & gxa(re,1)*rank4(re, 2)+gxa(im,1)*rank4(im, 2)+&
     549              : & gxa(re,2)*rank4(re,11)+gxa(im,2)*rank4(im,11)+&
     550              : & gxa(re,3)*rank4(re,12)+gxa(im,3)*rank4(im,12)+&
     551              : & gxa(re,4)*rank4(re,13)+gxa(im,4)*rank4(im,13)+&
     552              : & gxa(re,5)*rank4(re, 9)+gxa(im,5)*rank4(im, 9)+&
     553       634069 : & gxa(re,6)*rank4(re, 7)+gxa(im,6)*rank4(im, 7))
     554              : 
     555              : !a=3, b=3 in rank2(a,b) --> maps to index 3
     556              :  rank2(3)=2.0d0*(&
     557              : & gxa(re,1)*rank4(re, 3)+gxa(im,1)*rank4(im, 3)+&
     558              : & gxa(re,2)*rank4(re,12)+gxa(im,2)*rank4(im,12)+&
     559              : & gxa(re,3)*rank4(re,15)+gxa(im,3)*rank4(im,15)+&
     560              : & gxa(re,4)*rank4(re,14)+gxa(im,4)*rank4(im,14)+&
     561              : & gxa(re,5)*rank4(re,10)+gxa(im,5)*rank4(im,10)+&
     562       634069 : & gxa(re,6)*rank4(re, 8)+gxa(im,6)*rank4(im, 8))
     563              : 
     564              : !a=3, b=2 in rank2(a,b) --> maps to index 4
     565              :  rank2(4)=2.0d0*(&
     566              : & gxa(re,1)*rank4(re, 4)+gxa(im,1)*rank4(im, 4)+&
     567              : & gxa(re,2)*rank4(re,13)+gxa(im,2)*rank4(im,13)+&
     568              : & gxa(re,3)*rank4(re,14)+gxa(im,3)*rank4(im,14)+&
     569              : & gxa(re,4)*rank4(re,12)+gxa(im,4)*rank4(im,12)+&
     570              : & gxa(re,5)*rank4(re, 8)+gxa(im,5)*rank4(im, 8)+&
     571       634069 : & gxa(re,6)*rank4(re, 9)+gxa(im,6)*rank4(im, 9))
     572              : 
     573              : !a=3, b=1 in rank2(a,b) --> maps to index 5
     574              :  rank2(5)=2.0d0*(&
     575              : & gxa(re,1)*rank4(re, 5)+gxa(im,1)*rank4(im, 5)+&
     576              : & gxa(re,2)*rank4(re, 9)+gxa(im,2)*rank4(im, 9)+&
     577              : & gxa(re,3)*rank4(re,10)+gxa(im,3)*rank4(im,10)+&
     578              : & gxa(re,4)*rank4(re, 8)+gxa(im,4)*rank4(im, 8)+&
     579              : & gxa(re,5)*rank4(re, 3)+gxa(im,5)*rank4(im, 3)+&
     580       634069 : & gxa(re,6)*rank4(re, 4)+gxa(im,6)*rank4(im, 4))
     581              : 
     582              : !a=2, b=1 in rank2(a,b) --> maps to index 6
     583              :  rank2(6)=2.0d0*(&
     584              : & gxa(re,1)*rank4(re, 6)+gxa(im,1)*rank4(im, 6)+&
     585              : & gxa(re,2)*rank4(re, 7)+gxa(im,2)*rank4(im, 7)+&
     586              : & gxa(re,3)*rank4(re, 8)+gxa(im,3)*rank4(im, 8)+&
     587              : & gxa(re,4)*rank4(re, 9)+gxa(im,4)*rank4(im, 9)+&
     588              : & gxa(re,5)*rank4(re, 4)+gxa(im,5)*rank4(im, 4)+&
     589       634069 : & gxa(re,6)*rank4(re, 2)+gxa(im,6)*rank4(im, 2))
     590              : 
     591       634069 : end subroutine cont24
     592              : !!***
     593              : 
     594              : !!****f* m_contract/cont3
     595              : !! NAME
     596              : !! cont3
     597              : !!
     598              : !! FUNCTION
     599              : !! Compute several specialized contractions needed for the
     600              : !! l=3 part of the stress tensor.
     601              : !!
     602              : !! INPUTS
     603              : !!  gxa(2,10)=complex symmetric rank 3 tensor
     604              : !!  gmet(3,3)=usual metric tensor, a symmetric matrix stored in
     605              : !!            full storage mode (bohr^-2)
     606              : !!
     607              : !! OUTPUT
     608              : !!  rank2(6)=2*Re[contraction] given by
     609              : !!   2*Re[(15/2)*r3(a,i,j)*r3(b,j,i)-3*r1(i)*r3(a,b,i)-(3/2)*r1(a)*r1(b)]
     610              : !!   where r3(a,i,j)=gmet(j,k) gxa(a,i,k) and r1(a)=gmet(i,j) gxa(i,j,a).
     611              : !!  rank2 is stored in the compressed form 11 22 33 32 31 21.
     612              : !!
     613              : !! NOTES
     614              : !! Input gxa is a completely symmetric rank 3 tensor (complex)
     615              : !! in compressed storage: 111 221 331 321 311 211 222 332 322 333.
     616              : !! The output tensor is completely symmetric rank 2, real, and is given by
     617              : !!  $2 Re[{15 \over 2} r3(a,i,j) r3(b,j,i) - 3 r1(i) r3(a,b,i) - {3 \over 2} r1(a) r1(b)]$
     618              : !!  where $r3(a,i,j)=gmet(j,k) gxa(a,i,k)$ and $r1(a)=gmet(i,j) gxa(i,j,a)$.
     619              : !!  rank2 is stored in the compressed form 11 22 33 32 31 21.
     620              : !!
     621              : !! SOURCE
     622              : 
     623        37366 : subroutine cont3(gxa,gmet,rank2)
     624              : 
     625              : !Arguments ------------------------------------
     626              : !arrays
     627              :  real(dp),intent(in) :: gmet(3,3),gxa(2,10)
     628              :  real(dp),intent(out) :: rank2(6)
     629              : 
     630              : !Local variables-------------------------------
     631              : !scalars
     632              :  integer,parameter :: im=2,re=1
     633              :  integer :: ii
     634              : !arrays
     635              :  real(dp) :: r1(2,3),r3(2,18),s13(6),s33(6)
     636              : 
     637              : ! *************************************************************************
     638              : 
     639              : !Compute r1(a) = gmet(i,j) gxa(i,j,a)
     640              : 
     641              : !Write out components for 3 distinct terms, Re and Im
     642       112098 :  do ii=1,2
     643              :    r1(ii,1)=gmet(1,1)*gxa(ii,1)+gmet(2,2)*gxa(ii,2)+&
     644              : &   gmet(3,3)*gxa(ii,3)+2.d0*(&
     645              : &   gmet(3,2)*gxa(ii,4)+gmet(3,1)*gxa(ii,5)+&
     646        74732 : &   gmet(2,1)*gxa(ii,6))
     647              :    r1(ii,2)=gmet(1,1)*gxa(ii,6)+gmet(2,2)*gxa(ii,7)+&
     648              : &   gmet(3,3)*gxa(ii,8)+2.d0*(&
     649              : &   gmet(3,2)*gxa(ii,9)+gmet(3,1)*gxa(ii,4)+&
     650        74732 : &   gmet(2,1)*gxa(ii,2))
     651              :    r1(ii,3)=gmet(1,1)*gxa(ii,5)+gmet(2,2)*gxa(ii,9)+&
     652              : &   gmet(3,3)*gxa(ii,10)+2.d0*(&
     653              : &   gmet(3,2)*gxa(ii,8)+gmet(3,1)*gxa(ii,3)+&
     654       112098 : &   gmet(2,1)*gxa(ii,4))
     655              :  end do
     656              : 
     657              : !Compute r3(a,b,k)=gmet(k,n) gxa(a,b,n)
     658              : 
     659              : !Write out components for 18 distinct terms, Re and Im
     660              : !(symmetric in first two indices, not in all permutations)
     661              : !store as 111 221 331 321 311 211
     662              : !112 222 332 322 312 212
     663              : !113 223 333 323 313 213
     664       112098 :  do ii=1,2
     665              :    r3(ii, 1)=gmet(1,1)*gxa(ii,1)+gmet(2,1)*gxa(ii,6)+&
     666        74732 : &   gmet(3,1)*gxa(ii,5)
     667              :    r3(ii, 2)=gmet(1,1)*gxa(ii,2)+gmet(2,1)*gxa(ii,7)+&
     668        74732 : &   gmet(3,1)*gxa(ii,9)
     669              :    r3(ii, 3)=gmet(1,1)*gxa(ii,3)+gmet(2,1)*gxa(ii,8)+&
     670        74732 : &   gmet(3,1)*gxa(ii,10)
     671              :    r3(ii, 4)=gmet(1,1)*gxa(ii,4)+gmet(2,1)*gxa(ii,9)+&
     672        74732 : &   gmet(3,1)*gxa(ii,8)
     673              :    r3(ii, 5)=gmet(1,1)*gxa(ii,5)+gmet(2,1)*gxa(ii,4)+&
     674        74732 : &   gmet(3,1)*gxa(ii,3)
     675              :    r3(ii, 6)=gmet(1,1)*gxa(ii,6)+gmet(2,1)*gxa(ii,2)+&
     676        74732 : &   gmet(3,1)*gxa(ii,4)
     677              :    r3(ii, 7)=gmet(2,1)*gxa(ii,1)+gmet(2,2)*gxa(ii,6)+&
     678        74732 : &   gmet(3,2)*gxa(ii,5)
     679              :    r3(ii, 8)=gmet(2,1)*gxa(ii,2)+gmet(2,2)*gxa(ii,7)+&
     680        74732 : &   gmet(3,2)*gxa(ii,9)
     681              :    r3(ii, 9)=gmet(2,1)*gxa(ii,3)+gmet(2,2)*gxa(ii,8)+&
     682        74732 : &   gmet(3,2)*gxa(ii,10)
     683              :    r3(ii,10)=gmet(2,1)*gxa(ii,4)+gmet(2,2)*gxa(ii,9)+&
     684        74732 : &   gmet(3,2)*gxa(ii,8)
     685              :    r3(ii,11)=gmet(2,1)*gxa(ii,5)+gmet(2,2)*gxa(ii,4)+&
     686        74732 : &   gmet(3,2)*gxa(ii,3)
     687              :    r3(ii,12)=gmet(2,1)*gxa(ii,6)+gmet(2,2)*gxa(ii,2)+&
     688        74732 : &   gmet(3,2)*gxa(ii,4)
     689              :    r3(ii,13)=gmet(3,1)*gxa(ii,1)+gmet(3,2)*gxa(ii,6)+&
     690        74732 : &   gmet(3,3)*gxa(ii,5)
     691              :    r3(ii,14)=gmet(3,1)*gxa(ii,2)+gmet(3,2)*gxa(ii,7)+&
     692        74732 : &   gmet(3,3)*gxa(ii,9)
     693              :    r3(ii,15)=gmet(3,1)*gxa(ii,3)+gmet(3,2)*gxa(ii,8)+&
     694        74732 : &   gmet(3,3)*gxa(ii,10)
     695              :    r3(ii,16)=gmet(3,1)*gxa(ii,4)+gmet(3,2)*gxa(ii,9)+&
     696        74732 : &   gmet(3,3)*gxa(ii,8)
     697              :    r3(ii,17)=gmet(3,1)*gxa(ii,5)+gmet(3,2)*gxa(ii,4)+&
     698        74732 : &   gmet(3,3)*gxa(ii,3)
     699              :    r3(ii,18)=gmet(3,1)*gxa(ii,6)+gmet(3,2)*gxa(ii,2)+&
     700       112098 : &   gmet(3,3)*gxa(ii,4)
     701              : 
     702              :  end do
     703              : 
     704              : !Now need
     705              : !2*Re[(15/2)*r3(a,i,j)*r3(b,j,i)-3*r1(i)*r3(a,b,i)-(3/2)*r1(a)*r1(b)].
     706              : 
     707              : !Write out s33(a,b)=2*Re[r3(a,i,j)*r3(b,j,i)]
     708              : 
     709              :  s33(1)=2.d0*(r3(re, 1)*r3(re, 1)+r3(im, 1)*r3(im, 1)+&
     710              : & r3(re,12)*r3(re,12)+r3(im,12)*r3(im,12)+&
     711              : & r3(re,17)*r3(re,17)+r3(im,17)*r3(im,17)+&
     712              : & r3(re,11)*r3(re,18)+r3(im,11)*r3(im,18)+&
     713              : & r3(re,18)*r3(re,11)+r3(im,18)*r3(im,11)+&
     714              : & r3(re, 5)*r3(re,13)+r3(im, 5)*r3(im,13)+&
     715              : & r3(re,13)*r3(re, 5)+r3(im,13)*r3(im, 5)+&
     716              : & r3(re, 6)*r3(re, 7)+r3(im, 6)*r3(im, 7)+&
     717        37366 : & r3(re, 7)*r3(re, 6)+r3(im, 7)*r3(im, 6))
     718              : 
     719              :  s33(2)=2.d0*(r3(re, 6)*r3(re, 6)+r3(im, 6)*r3(im, 6)+&
     720              : & r3(re, 8)*r3(re, 8)+r3(im, 8)*r3(im, 8)+&
     721              : & r3(re,16)*r3(re,16)+r3(im,16)*r3(im,16)+&
     722              : & r3(re,10)*r3(re,14)+r3(im,10)*r3(im,14)+&
     723              : & r3(re,14)*r3(re,10)+r3(im,14)*r3(im,10)+&
     724              : & r3(re, 4)*r3(re,18)+r3(im, 4)*r3(im,18)+&
     725              : & r3(re,18)*r3(re, 4)+r3(im,18)*r3(im, 4)+&
     726              : & r3(re, 2)*r3(re,12)+r3(im, 2)*r3(im,12)+&
     727        37366 : & r3(re,12)*r3(re, 2)+r3(im,12)*r3(im, 2))
     728              : 
     729              :  s33(3)=2.d0*(r3(re, 5)*r3(re, 5)+r3(im, 5)*r3(im, 5)+&
     730              : & r3(re,10)*r3(re,10)+r3(im,10)*r3(im,10)+&
     731              : & r3(re,15)*r3(re,15)+r3(im,15)*r3(im,15)+&
     732              : & r3(re, 9)*r3(re,16)+r3(im, 9)*r3(im,16)+&
     733              : & r3(re,16)*r3(re, 9)+r3(im,16)*r3(im, 9)+&
     734              : & r3(re, 3)*r3(re,17)+r3(im, 3)*r3(im,17)+&
     735              : & r3(re,17)*r3(re, 3)+r3(im,17)*r3(im, 3)+&
     736              : & r3(re, 4)*r3(re,11)+r3(im, 4)*r3(im,11)+&
     737        37366 : & r3(re,11)*r3(re, 4)+r3(im,11)*r3(im, 4))
     738              : 
     739              :  s33(4)=2.d0*(r3(re, 5)*r3(re, 6)+r3(im, 5)*r3(im, 6)+&
     740              : & r3(re,10)*r3(re, 8)+r3(im,10)*r3(im, 8)+&
     741              : & r3(re,15)*r3(re,16)+r3(im,15)*r3(im,16)+&
     742              : & r3(re, 9)*r3(re,14)+r3(im, 9)*r3(im,14)+&
     743              : & r3(re,16)*r3(re,10)+r3(im,16)*r3(im,10)+&
     744              : & r3(re, 3)*r3(re,18)+r3(im, 3)*r3(im,18)+&
     745              : & r3(re,17)*r3(re, 4)+r3(im,17)*r3(im, 4)+&
     746              : & r3(re, 4)*r3(re,12)+r3(im, 4)*r3(im,12)+&
     747        37366 : & r3(re,11)*r3(re, 2)+r3(im,11)*r3(im, 2))
     748              : 
     749              :  s33(5)=2.d0*(r3(re, 5)*r3(re, 1)+r3(im, 5)*r3(im, 1)+&
     750              : & r3(re,10)*r3(re,12)+r3(im,10)*r3(im,12)+&
     751              : & r3(re,15)*r3(re,17)+r3(im,15)*r3(im,17)+&
     752              : & r3(re, 9)*r3(re,18)+r3(im, 9)*r3(im,18)+&
     753              : & r3(re,16)*r3(re,11)+r3(im,16)*r3(im,11)+&
     754              : & r3(re, 3)*r3(re,13)+r3(im, 3)*r3(im,13)+&
     755              : & r3(re,17)*r3(re, 5)+r3(im,17)*r3(im, 5)+&
     756              : & r3(re, 4)*r3(re, 7)+r3(im, 4)*r3(im, 7)+&
     757        37366 : & r3(re,11)*r3(re, 6)+r3(im,11)*r3(im, 6))
     758              : 
     759              :  s33(6)=2.d0*(r3(re, 6)*r3(re, 1)+r3(im, 6)*r3(im, 1)+&
     760              : & r3(re, 8)*r3(re,12)+r3(im, 8)*r3(im,12)+&
     761              : & r3(re,16)*r3(re,17)+r3(im,16)*r3(im,17)+&
     762              : & r3(re,10)*r3(re,18)+r3(im,10)*r3(im,18)+&
     763              : & r3(re,14)*r3(re,11)+r3(im,14)*r3(im,11)+&
     764              : & r3(re, 4)*r3(re,13)+r3(im, 4)*r3(im,13)+&
     765              : & r3(re,18)*r3(re, 5)+r3(im,18)*r3(im, 5)+&
     766              : & r3(re, 2)*r3(re, 7)+r3(im, 2)*r3(im, 7)+&
     767        37366 : & r3(re,12)*r3(re, 6)+r3(im,12)*r3(im, 6))
     768              : 
     769              : 
     770              : !Write out s13(a,b)=2*Re[r1(i)*r3(a,b,i)]
     771              : 
     772              :  s13(1)=2.d0*(r1(re,1)*r3(re, 1)+r1(im,1)*r3(im, 1)+&
     773              : & r1(re,2)*r3(re, 7)+r1(im,2)*r3(im, 7)+&
     774        37366 : & r1(re,3)*r3(re,13)+r1(im,3)*r3(im,13))
     775              :  s13(2)=2.d0*(r1(re,1)*r3(re, 2)+r1(im,1)*r3(im, 2)+&
     776              : & r1(re,2)*r3(re, 8)+r1(im,2)*r3(im, 8)+&
     777        37366 : & r1(re,3)*r3(re,14)+r1(im,3)*r3(im,14))
     778              :  s13(3)=2.d0*(r1(re,1)*r3(re, 3)+r1(im,1)*r3(im, 3)+&
     779              : & r1(re,2)*r3(re, 9)+r1(im,2)*r3(im, 9)+&
     780        37366 : & r1(re,3)*r3(re,15)+r1(im,3)*r3(im,15))
     781              :  s13(4)=2.d0*(r1(re,1)*r3(re, 4)+r1(im,1)*r3(im, 4)+&
     782              : & r1(re,2)*r3(re,10)+r1(im,2)*r3(im,10)+&
     783        37366 : & r1(re,3)*r3(re,16)+r1(im,3)*r3(im,16))
     784              :  s13(5)=2.d0*(r1(re,1)*r3(re, 5)+r1(im,1)*r3(im, 5)+&
     785              : & r1(re,2)*r3(re,11)+r1(im,2)*r3(im,11)+&
     786        37366 : & r1(re,3)*r3(re,17)+r1(im,3)*r3(im,17))
     787              :  s13(6)=2.d0*(r1(re,1)*r3(re, 6)+r1(im,1)*r3(im, 6)+&
     788              : & r1(re,2)*r3(re,12)+r1(im,2)*r3(im,12)+&
     789        37366 : & r1(re,3)*r3(re,18)+r1(im,3)*r3(im,18))
     790              : 
     791              : !Finally, write out the six terms as final answer
     792              : !rank2(a,b)=(15/2)*s33(a,b)-3*s13(a,b)-(3/2)*2*Re[r1(a)*r1(b)]
     793              : 
     794              :  rank2(1)=7.5d0*s33(1)-3.d0*s13(1)&
     795        37366 : & -3.d0*(r1(re,1)*r1(re,1)+r1(im,1)*r1(im,1))
     796              :  rank2(2)=7.5d0*s33(2)-3.d0*s13(2)&
     797        37366 : & -3.d0*(r1(re,2)*r1(re,2)+r1(im,2)*r1(im,2))
     798              :  rank2(3)=7.5d0*s33(3)-3.d0*s13(3)&
     799        37366 : & -3.d0*(r1(re,3)*r1(re,3)+r1(im,3)*r1(im,3))
     800              :  rank2(4)=7.5d0*s33(4)-3.d0*s13(4)&
     801        37366 : & -3.d0*(r1(re,3)*r1(re,2)+r1(im,3)*r1(im,2))
     802              :  rank2(5)=7.5d0*s33(5)-3.d0*s13(5)&
     803        37366 : & -3.d0*(r1(re,3)*r1(re,1)+r1(im,3)*r1(im,1))
     804              :  rank2(6)=7.5d0*s33(6)-3.d0*s13(6)&
     805        37366 : & -3.d0*(r1(re,2)*r1(re,1)+r1(im,2)*r1(im,1))
     806              : 
     807        37366 : end subroutine cont3
     808              : !!***
     809              : 
     810              : !!****f* m_contract/cont33cso
     811              : !! NAME
     812              : !! cont33cso
     813              : !!
     814              : !! FUNCTION
     815              : !! Contract symmetric rank 3 tensor gxa1 with symmetric rank 3 tensor
     816              : !! gxa2 using metric tensor gmet to produce rank 2 complex tensor.
     817              : !!
     818              : !! INPUTS
     819              : !!  gxa1(2,10)=rank 3 complex symmetric tensor
     820              : !!  gxa2(2,10)=rank 3 complex symmetric tensor
     821              : !!  gmet(3,3)=usual metric tensor (symmetric, real)
     822              : !!
     823              : !! OUTPUT
     824              : !!  rank2c(2,6)=rank 2 complex tensor (pseudo-symmetric storage)
     825              : !!
     826              : !! NOTES
     827              : !! This contraction is used for spin-orbit correction in non-local
     828              : !! contribution to stresses.
     829              : !!
     830              : !! Symmetric gxa1, gxa2 are stored as
     831              : !!               111 221 331 321 311 211 222 332 322 333;
     832              : !! gmet(3,3) is symmetric but stored fully (9 elements);
     833              : !! Output rank2c is not symmetric but since
     834              : !!      $rank2c_{gxa1,gxa2}(a,b)=conjg(rank2c_{gxa2,gxa1}(b,a))$
     835              : !!       it is stored as 11 22 33 32 31 21.
     836              : !!
     837              : !! rank2c(1,1), rank2c(2,2), rank3c(3,3) are not needed;
     838              : !! They are not calculated.
     839              : !!
     840              : !!{{\ \begin{equation}
     841              : !! rank2c(a,b)=7.5 conjg(gxa1(a,i,j))*r_3(i,j,b) - 1.5 r_{11}(a)*r_{12}(b)
     842              : !!\end{equation} }}
     843              : !!   where:
     844              : !!{{\ \begin{eqnarray}
     845              : !! r_3(i,j,b) & = & gxa2(b,l,m) gmet(i,l) gmet(j,m) \nonumber
     846              : !! r_{11}(a)  & = & conjg(gxa1(a,l,m)) gmet(l,m)    \nonumber
     847              : !! r_{12}(b)  & = & gxa2(b,l,m) gmet(l,m)
     848              : !! \end{eqnarray} }}
     849              : !!
     850              : !! SOURCE
     851              : 
     852        65360 : subroutine cont33cso(gxa1,gxa2,gmet,rank2c)
     853              : 
     854              : !Arguments ------------------------------------
     855              : !arrays
     856              :  real(dp),intent(in) :: gmet(3,3),gxa1(2,10),gxa2(2,10)
     857              :  real(dp),intent(out) :: rank2c(2,6)
     858              : 
     859              : !Local variables-------------------------------
     860              : !scalars
     861              :  integer,parameter :: im=2,re=1
     862              : !arrays
     863              :  real(dp) :: r11(2,3),r12(2,3),r3(2,6,3),r3a(2,6,3)
     864              : 
     865              : ! *************************************************************************
     866              : 
     867              : !Initialize output tensor
     868        65360 :  rank2c(:,:)=0.d0
     869              : 
     870              : !Compute r3(i,j,b)=gxa2(b,l,m)*gmet(i,l)*gmet(j,m)
     871              : !stored as 11 22 33 32 31 21 for (i,j)
     872              : !First compute r3a(b,l,j)=gxa2(b,l,m)*gmet(j,m)
     873              : !stored as r3a(re/im,(b,l),j)
     874       196080 :  r3a(:,1,1)=gxa2(:,1 )*gmet(1,1)+gxa2(:,6 )*gmet(1,2)+gxa2(:,5 )*gmet(1,3)
     875       196080 :  r3a(:,2,1)=gxa2(:,2 )*gmet(1,1)+gxa2(:,7 )*gmet(1,2)+gxa2(:,9 )*gmet(1,3)
     876              :  r3a(:,3,1)=gxa2(:,3 )*gmet(1,1)+gxa2(:,8 )*gmet(1,2)+gxa2(:,10)*gmet(1,3)
     877       196080 :  r3a(:,4,1)=gxa2(:,4 )*gmet(1,1)+gxa2(:,9 )*gmet(1,2)+gxa2(:,8 )*gmet(1,3)
     878       196080 :  r3a(:,5,1)=gxa2(:,5 )*gmet(1,1)+gxa2(:,4 )*gmet(1,2)+gxa2(:,3 )*gmet(1,3)
     879       196080 :  r3a(:,6,1)=gxa2(:,6 )*gmet(1,1)+gxa2(:,2 )*gmet(1,2)+gxa2(:,4 )*gmet(1,3)
     880       196080 :  r3a(:,1,2)=gxa2(:,1 )*gmet(2,1)+gxa2(:,6 )*gmet(2,2)+gxa2(:,5 )*gmet(2,3)
     881       196080 :  r3a(:,2,2)=gxa2(:,2 )*gmet(2,1)+gxa2(:,7 )*gmet(2,2)+gxa2(:,9 )*gmet(2,3)
     882              :  r3a(:,3,2)=gxa2(:,3 )*gmet(2,1)+gxa2(:,8 )*gmet(2,2)+gxa2(:,10)*gmet(2,3)
     883       196080 :  r3a(:,4,2)=gxa2(:,4 )*gmet(2,1)+gxa2(:,9 )*gmet(2,2)+gxa2(:,8 )*gmet(2,3)
     884       196080 :  r3a(:,5,2)=gxa2(:,5 )*gmet(2,1)+gxa2(:,4 )*gmet(2,2)+gxa2(:,3 )*gmet(2,3)
     885       196080 :  r3a(:,6,2)=gxa2(:,6 )*gmet(2,1)+gxa2(:,2 )*gmet(2,2)+gxa2(:,4 )*gmet(2,3)
     886       196080 :  r3a(:,1,3)=gxa2(:,1 )*gmet(3,1)+gxa2(:,6 )*gmet(3,2)+gxa2(:,5 )*gmet(3,3)
     887       196080 :  r3a(:,2,3)=gxa2(:,2 )*gmet(3,1)+gxa2(:,7 )*gmet(3,2)+gxa2(:,9 )*gmet(3,3)
     888              :  r3a(:,3,3)=gxa2(:,3 )*gmet(3,1)+gxa2(:,8 )*gmet(3,2)+gxa2(:,10)*gmet(3,3)
     889       196080 :  r3a(:,4,3)=gxa2(:,4 )*gmet(3,1)+gxa2(:,9 )*gmet(3,2)+gxa2(:,8 )*gmet(3,3)
     890       196080 :  r3a(:,5,3)=gxa2(:,5 )*gmet(3,1)+gxa2(:,4 )*gmet(3,2)+gxa2(:,3 )*gmet(3,3)
     891       196080 :  r3a(:,6,3)=gxa2(:,6 )*gmet(3,1)+gxa2(:,2 )*gmet(3,2)+gxa2(:,4 )*gmet(3,3)
     892              : 
     893              : !Then  compute r3(i,j,b)=r3a(b,l,j)*gmet(i,l)
     894              : !stored as r3(re/im,(i,j),b)
     895       196080 :  r3(:,1,1)=r3a(:,1,1)*gmet(1,1)+r3a(:,6,1)*gmet(1,2)+r3a(:,5,1)*gmet(1,3)
     896       196080 :  r3(:,1,2)=r3a(:,6,1)*gmet(1,1)+r3a(:,2,1)*gmet(1,2)+r3a(:,4,1)*gmet(1,3)
     897              :  r3(:,1,3)=r3a(:,5,1)*gmet(1,1)+r3a(:,4,1)*gmet(1,2)+r3a(:,3,1)*gmet(1,3)
     898       196080 :  r3(:,2,1)=r3a(:,1,2)*gmet(2,1)+r3a(:,6,2)*gmet(2,2)+r3a(:,5,2)*gmet(2,3)
     899       196080 :  r3(:,2,2)=r3a(:,6,2)*gmet(2,1)+r3a(:,2,2)*gmet(2,2)+r3a(:,4,2)*gmet(2,3)
     900              :  r3(:,2,3)=r3a(:,5,2)*gmet(2,1)+r3a(:,4,2)*gmet(2,2)+r3a(:,3,2)*gmet(2,3)
     901       196080 :  r3(:,3,1)=r3a(:,1,3)*gmet(3,1)+r3a(:,6,3)*gmet(3,2)+r3a(:,5,3)*gmet(3,3)
     902       196080 :  r3(:,3,2)=r3a(:,6,3)*gmet(3,1)+r3a(:,2,3)*gmet(3,2)+r3a(:,4,3)*gmet(3,3)
     903              :  r3(:,3,3)=r3a(:,5,3)*gmet(3,1)+r3a(:,4,3)*gmet(3,2)+r3a(:,3,3)*gmet(3,3)
     904       196080 :  r3(:,4,1)=r3a(:,1,2)*gmet(3,1)+r3a(:,6,2)*gmet(3,2)+r3a(:,5,2)*gmet(3,3)
     905       196080 :  r3(:,4,2)=r3a(:,6,2)*gmet(3,1)+r3a(:,2,2)*gmet(3,2)+r3a(:,4,2)*gmet(3,3)
     906              :  r3(:,4,3)=r3a(:,5,2)*gmet(3,1)+r3a(:,4,2)*gmet(3,2)+r3a(:,3,2)*gmet(3,3)
     907       196080 :  r3(:,5,1)=r3a(:,1,1)*gmet(3,1)+r3a(:,6,1)*gmet(3,2)+r3a(:,5,1)*gmet(3,3)
     908       196080 :  r3(:,5,2)=r3a(:,6,1)*gmet(3,1)+r3a(:,2,1)*gmet(3,2)+r3a(:,4,1)*gmet(3,3)
     909              :  r3(:,5,3)=r3a(:,5,1)*gmet(3,1)+r3a(:,4,1)*gmet(3,2)+r3a(:,3,1)*gmet(3,3)
     910       196080 :  r3(:,6,1)=r3a(:,1,1)*gmet(2,1)+r3a(:,6,1)*gmet(2,2)+r3a(:,5,1)*gmet(2,3)
     911       196080 :  r3(:,6,2)=r3a(:,6,1)*gmet(2,1)+r3a(:,2,1)*gmet(2,2)+r3a(:,4,1)*gmet(2,3)
     912              :  r3(:,6,3)=r3a(:,5,1)*gmet(2,1)+r3a(:,4,1)*gmet(2,2)+r3a(:,3,1)*gmet(2,3)
     913              : 
     914              : !Compute r11(a)=conjg(gxa1(a,l,m))*gmet(l,m)
     915              :  r11(:,1)=gxa1(:,1)*gmet(1,1)+gxa1(:,2)*gmet(2,2)+gxa1(:,3 )*gmet(3,3)&
     916              : & +2.d0*(gxa1(:,4)*gmet(3,2)+gxa1(:,5)*gmet(3,1)+gxa1(:,6 )*gmet(2,1))
     917              :  r11(:,2)=gxa1(:,6)*gmet(1,1)+gxa1(:,7)*gmet(2,2)+gxa1(:,8 )*gmet(3,3)&
     918       196080 : & +2.d0*(gxa1(:,9)*gmet(3,2)+gxa1(:,4)*gmet(3,1)+gxa1(:,2 )*gmet(2,1))
     919              :  r11(:,3)=gxa1(:,5)*gmet(1,1)+gxa1(:,9)*gmet(2,2)+gxa1(:,10)*gmet(3,3)&
     920       196080 : & +2.d0*(gxa1(:,8)*gmet(3,2)+gxa1(:,3)*gmet(3,1)+gxa1(:,4 )*gmet(2,1))
     921        65360 :  r11(im,1)=-r11(im,1);r11(im,2)=-r11(im,2);r11(im,3)=-r11(im,3)
     922              : 
     923              : !Compute r12(b)=gxa2(b,l,m)*gmet(l,m)
     924              :  r12(:,1)=gxa2(:,1)*gmet(1,1)+gxa2(:,2)*gmet(2,2)+gxa2(:,3 )*gmet(3,3)&
     925       196080 : & +2.d0*(gxa2(:,4)*gmet(3,2)+gxa2(:,5)*gmet(3,1)+gxa2(:,6 )*gmet(2,1))
     926              :  r12(:,2)=gxa2(:,6)*gmet(1,1)+gxa2(:,7)*gmet(2,2)+gxa2(:,8 )*gmet(3,3)&
     927       196080 : & +2.d0*(gxa2(:,9)*gmet(3,2)+gxa2(:,4)*gmet(3,1)+gxa2(:,2 )*gmet(2,1))
     928              :  r12(:,3)=gxa2(:,5)*gmet(1,1)+gxa2(:,9)*gmet(2,2)+gxa2(:,10)*gmet(3,3)&
     929              : & +2.d0*(gxa2(:,8)*gmet(3,2)+gxa2(:,3)*gmet(3,1)+gxa2(:,4 )*gmet(2,1))
     930              : 
     931              : !Finally compute rank2c(a,b)=7.5*conjg(gxa1(a,i,j))*r3(i,j,b) - 1.5*r11(a)*r12(b)
     932              : !rank2c(re,1)=7.5d0*(gxa1(re,1 )*r3(re,1,1)+gxa1(im,1 )*r3(im,1,1)&
     933              : !&                    +gxa1(re,2 )*r3(re,2,1)+gxa1(im,2 )*r3(im,2,1)&
     934              : !&                    +gxa1(re,3 )*r3(re,3,1)+gxa1(im,3 )*r3(im,3,1))&
     935              : !&             +15.d0*(gxa1(re,4 )*r3(re,4,1)+gxa1(im,4 )*r3(im,4,1)&
     936              : !&                    +gxa1(re,5 )*r3(re,5,1)+gxa1(im,5 )*r3(im,5,1)&
     937              : !&                    +gxa1(re,6 )*r3(re,6,1)+gxa1(im,6 )*r3(im,6,1))&
     938              : !&             -1.5d0*(r11(re,1)*r12(re,1)-r11(im,1)*r12(im,1))
     939              : !rank2c(re,2)=7.5d0*(gxa1(re,6 )*r3(re,1,2)+gxa1(im,6 )*r3(im,1,2)&
     940              : !&                    +gxa1(re,7 )*r3(re,2,2)+gxa1(im,7 )*r3(im,2,2)&
     941              : !&                    +gxa1(re,8 )*r3(re,3,2)+gxa1(im,8 )*r3(im,3,2))&
     942              : !&             +15.d0*(gxa1(re,9 )*r3(re,4,2)+gxa1(im,9 )*r3(im,4,2)&
     943              : !&                    +gxa1(re,4 )*r3(re,5,2)+gxa1(im,4 )*r3(im,5,2)&
     944              : !&                    +gxa1(re,2 )*r3(re,6,2)+gxa1(im,2 )*r3(im,6,2))&
     945              : !&             -1.5d0*(r11(re,2)*r12(re,2)-r11(im,2)*r12(im,2))
     946              : !rank2c(re,3)=7.5d0*(gxa1(re,5 )*r3(re,1,3)+gxa1(im,5 )*r3(im,1,3)&
     947              : !&                    +gxa1(re,9 )*r3(re,2,3)+gxa1(im,9 )*r3(im,2,3)&
     948              : !&                    +gxa1(re,10)*r3(re,3,3)+gxa1(im,10)*r3(im,3,3))&
     949              : !&             +15.d0*(gxa1(re,8 )*r3(re,4,3)+gxa1(im,8 )*r3(im,4,3)&
     950              : !&                    +gxa1(re,3 )*r3(re,5,3)+gxa1(im,3 )*r3(im,5,3)&
     951              : !&                    +gxa1(re,4 )*r3(re,6,3)+gxa1(im,4 )*r3(im,6,3))&
     952              : !&             -1.5d0*(r11(re,3)*r12(re,3)-r11(im,3)*r12(im,3))
     953              :  rank2c(re,4)=7.5d0*(gxa1(re,5 )*r3(re,1,2)+gxa1(im,5 )*r3(im,1,2)&
     954              : & +gxa1(re,9 )*r3(re,2,2)+gxa1(im,9 )*r3(im,2,2)&
     955              : & +gxa1(re,10)*r3(re,3,2)+gxa1(im,10)*r3(im,3,2))&
     956              : & +15.d0*(gxa1(re,8 )*r3(re,4,2)+gxa1(im,8 )*r3(im,4,2)&
     957              : & +gxa1(re,3 )*r3(re,5,2)+gxa1(im,3 )*r3(im,5,2)&
     958              : & +gxa1(re,4 )*r3(re,6,2)+gxa1(im,4 )*r3(im,6,2))&
     959        65360 : & -1.5d0*(r11(re,3)*r12(re,2)-r11(im,3)*r12(im,2))
     960              :  rank2c(re,5)=7.5d0*(gxa1(re,5 )*r3(re,1,1)+gxa1(im,5 )*r3(im,1,1)&
     961              : & +gxa1(re,9 )*r3(re,2,1)+gxa1(im,9 )*r3(im,2,1)&
     962              : & +gxa1(re,10)*r3(re,3,1)+gxa1(im,10)*r3(im,3,1))&
     963              : & +15.d0*(gxa1(re,8 )*r3(re,4,1)+gxa1(im,8 )*r3(im,4,1)&
     964              : & +gxa1(re,3 )*r3(re,5,1)+gxa1(im,3 )*r3(im,5,1)&
     965              : & +gxa1(re,4 )*r3(re,6,1)+gxa1(im,4 )*r3(im,6,1))&
     966        65360 : & -1.5d0*(r11(re,3)*r12(re,1)-r11(im,3)*r12(im,1))
     967              :  rank2c(re,6)=7.5d0*(gxa1(re,6 )*r3(re,1,1)+gxa1(im,6 )*r3(im,1,1)&
     968              : & +gxa1(re,7 )*r3(re,2,1)+gxa1(im,7 )*r3(im,2,1)&
     969              : & +gxa1(re,8 )*r3(re,3,1)+gxa1(im,8 )*r3(im,3,1))&
     970              : & +15.d0*(gxa1(re,9 )*r3(re,4,1)+gxa1(im,9 )*r3(im,4,1)&
     971              : & +gxa1(re,4 )*r3(re,5,1)+gxa1(im,4 )*r3(im,5,1)&
     972              : & +gxa1(re,2 )*r3(re,6,1)+gxa1(im,2 )*r3(im,6,1))&
     973        65360 : & -1.5d0*(r11(re,2)*r12(re,1)-r11(im,2)*r12(im,1))
     974              : !rank2c(im,1)=7.5d0*(gxa1(re,1 )*r3(im,1,1)-gxa1(im,1 )*r3(re,1,1)&
     975              : !&                    +gxa1(re,2 )*r3(im,2,1)-gxa1(im,2 )*r3(re,2,1)&
     976              : !&                    +gxa1(re,3 )*r3(im,3,1)-gxa1(im,3 )*r3(re,3,1))&
     977              : !&             +15.d0*(gxa1(re,4 )*r3(im,4,1)-gxa1(im,4 )*r3(re,4,1)&
     978              : !&                    +gxa1(re,5 )*r3(im,5,1)-gxa1(im,5 )*r3(re,5,1)&
     979              : !&                    +gxa1(re,6 )*r3(im,6,1)-gxa1(im,6 )*r3(re,6,1))&
     980              : !&             -1.5d0*(r11(re,1)*r12(im,1)+r11(im,1)*r12(re,1))
     981              : !rank2c(im,2)=7.5d0*(gxa1(re,6 )*r3(im,1,2)-gxa1(im,6 )*r3(re,1,2)&
     982              : !&                    +gxa1(re,7 )*r3(im,2,2)-gxa1(im,7 )*r3(re,2,2)&
     983              : !&                    +gxa1(re,8 )*r3(im,3,2)-gxa1(im,8 )*r3(re,3,2))&
     984              : !&             +15.d0*(gxa1(re,9 )*r3(im,4,2)-gxa1(im,9 )*r3(re,4,2)&
     985              : !&                    +gxa1(re,4 )*r3(im,5,2)-gxa1(im,4 )*r3(re,5,2)&
     986              : !&                    +gxa1(re,2 )*r3(im,6,2)-gxa1(im,2 )*r3(re,6,2))&
     987              : !&             -1.5d0*(r11(re,2)*r12(im,2)+r11(im,2)*r12(re,2))
     988              : !rank2c(im,3)=7.5d0*(gxa1(re,5 )*r3(im,1,3)-gxa1(im,5 )*r3(re,1,3)&
     989              : !&                    +gxa1(re,9 )*r3(im,2,3)-gxa1(im,9 )*r3(re,2,3)&
     990              : !&                    +gxa1(re,10)*r3(im,3,3)-gxa1(im,10)*r3(re,3,3))&
     991              : !&             +15.d0*(gxa1(re,8 )*r3(im,4,3)-gxa1(im,8 )*r3(re,4,3)&
     992              : !&                    +gxa1(re,3 )*r3(im,5,3)-gxa1(im,3 )*r3(re,5,3)&
     993              : !&                    +gxa1(re,4 )*r3(im,6,3)-gxa1(im,4 )*r3(re,6,3))&
     994              : !&             -1.5d0*(r11(re,3)*r12(im,3)+r11(im,3)*r12(re,3))
     995              :  rank2c(im,4)=7.5d0*(gxa1(re,5 )*r3(im,1,2)-gxa1(im,5 )*r3(re,1,2)&
     996              : & +gxa1(re,9 )*r3(im,2,2)-gxa1(im,9 )*r3(re,2,2)&
     997              : & +gxa1(re,10)*r3(im,3,2)-gxa1(im,10)*r3(re,3,2))&
     998              : & +15.d0*(gxa1(re,8 )*r3(im,4,2)-gxa1(im,8 )*r3(re,4,2)&
     999              : & +gxa1(re,3 )*r3(im,5,2)-gxa1(im,3 )*r3(re,5,2)&
    1000              : & +gxa1(re,4 )*r3(im,6,2)-gxa1(im,4 )*r3(re,6,2))&
    1001        65360 : & -1.5d0*(r11(re,3)*r12(im,2)+r11(im,3)*r12(re,2))
    1002              :  rank2c(im,5)=7.5d0*(gxa1(re,5 )*r3(im,1,1)-gxa1(im,5 )*r3(re,1,1)&
    1003              : & +gxa1(re,9 )*r3(im,2,1)-gxa1(im,9 )*r3(re,2,1)&
    1004              : & +gxa1(re,10)*r3(im,3,1)-gxa1(im,10)*r3(re,3,1))&
    1005              : & +15.d0*(gxa1(re,8 )*r3(im,4,1)-gxa1(im,8 )*r3(re,4,1)&
    1006              : & +gxa1(re,3 )*r3(im,5,1)-gxa1(im,3 )*r3(re,5,1)&
    1007              : & +gxa1(re,4 )*r3(im,6,1)-gxa1(im,4 )*r3(re,6,1))&
    1008        65360 : & -1.5d0*(r11(re,3)*r12(im,1)+r11(im,3)*r12(re,1))
    1009              :  rank2c(im,6)=7.5d0*(gxa1(re,6 )*r3(im,1,1)-gxa1(im,6 )*r3(re,1,1)&
    1010              : & +gxa1(re,7 )*r3(im,2,1)-gxa1(im,7 )*r3(re,2,1)&
    1011              : & +gxa1(re,8 )*r3(im,3,1)-gxa1(im,8 )*r3(re,3,1))&
    1012              : & +15.d0*(gxa1(re,9 )*r3(im,4,1)-gxa1(im,9 )*r3(re,4,1)&
    1013              : & +gxa1(re,4 )*r3(im,5,1)-gxa1(im,4 )*r3(re,5,1)&
    1014              : & +gxa1(re,2 )*r3(im,6,1)-gxa1(im,2 )*r3(re,6,1))&
    1015        65360 : & -1.5d0*(r11(re,2)*r12(im,1)+r11(im,2)*r12(re,1))
    1016              : 
    1017        65360 : end subroutine cont33cso
    1018              : !!***
    1019              : 
    1020              : 
    1021              : !!****f* m_contract/cont33so
    1022              : !! NAME
    1023              : !! cont33so
    1024              : !!
    1025              : !! FUNCTION
    1026              : !! Contract symmetric rank 3 tensor gxa1 with symmetric rank 3 tensor
    1027              : !! gxa2 using metric tensor gmet and antisymmetric tensor amet to
    1028              : !! produce rank 2 real tensor.
    1029              : !!
    1030              : !! INPUTS
    1031              : !!  gxa1(2,10)=rank 3 complex symmetric tensor
    1032              : !!  gxa2(2,10)=rank 3 complex symmetric tensor
    1033              : !!  gmet(3,3)=usual metric tensor (symmetric, real)
    1034              : !!  amet(2,3,3)=antisymmetric complex tensor used for spin-orbit
    1035              : !!
    1036              : !! OUTPUT
    1037              : !!  rank2(6)=rank 2 real tensor (pseudo-symmetric storage)
    1038              : !!
    1039              : !! NOTES
    1040              : !! This contraction is used for spin-orbit correction in non-local
    1041              : !! contribution to stresses.
    1042              : !!
    1043              : !! Symmetric gxa1, gxa2 are stored as
    1044              : !!               111 221 331 321 311 211 222 332 322 333;
    1045              : !! gmet(3,3) is symmetric but stored fully (9 elements);
    1046              : !! amet(3,3) is antisymmetric but stored fully (9 elements);
    1047              : !! Output rank2 is not symmetric but since
    1048              : !!      $rank2_{gxa1,gxa2}(a,b)=conjg(rank2_{gxa2,gxa1}(b,a))$
    1049              : !!       it is stored as 11 22 33 32 31 21.
    1050              : !! Want 2*Re[contraction].
    1051              : !!
    1052              : !!{{\ \begin{equation}
    1053              : !! rank2(a,b)=2 Re[15 r_{3A}(a,i,j) r_{3G}(b,j,i)-3 r_{3A}(a,b,i) r_1(i)]
    1054              : !!\end{equation} }}
    1055              : !!   where:
    1056              : !!{{\ \begin{eqnarray}
    1057              : !!   r_1(i)        & = & gxa2(i,j,k) gmet(j,k) \nonumber
    1058              : !!   r_{3A}(i,j,k) & = & conjg(gxa1(p,i,j)) amet(p,k) \nonumber
    1059              : !!   r_{3G}(i,j,k) & = & gxa2(p,i,j) gmet(p,k)
    1060              : !! \end{eqnarray} }}
    1061              : !!
    1062              : !! SOURCE
    1063              : 
    1064        65360 : subroutine cont33so(gxa1,gxa2,gmet,amet,rank2)
    1065              : 
    1066              : !Arguments ------------------------------------
    1067              : !arrays
    1068              :  real(dp),intent(in) :: amet(2,3,3),gmet(3,3),gxa1(2,10),gxa2(2,10)
    1069              :  real(dp),intent(out) :: rank2(6)
    1070              : 
    1071              : !Local variables-------------------------------
    1072              : !scalars
    1073              :  integer,parameter :: im=2,re=1
    1074              :  integer :: ii
    1075              : !arrays
    1076              :  real(dp) :: r1(2,3),r3A(2,18),r3G(2,18),s31(6),s33(6)
    1077              : 
    1078              : ! *************************************************************************
    1079              : 
    1080              : !Compute r1(i)=gxa2(i,j,k)*gmet(j,k)
    1081              : 
    1082       196080 :  do ii=1,2
    1083              :    r1(ii,1)=gmet(1,1)*gxa2(ii,1)+gmet(2,2)*gxa2(ii,2)+&
    1084              : &   gmet(3,3)*gxa2(ii,3)+2.d0*(&
    1085              : &   gmet(3,2)*gxa2(ii,4)+gmet(3,1)*gxa2(ii,5)+&
    1086       130720 : &   gmet(2,1)*gxa2(ii,6))
    1087              :    r1(ii,2)=gmet(1,1)*gxa2(ii,6)+gmet(2,2)*gxa2(ii,7)+&
    1088              : &   gmet(3,3)*gxa2(ii,8)+2.d0*(&
    1089              : &   gmet(3,2)*gxa2(ii,9)+gmet(3,1)*gxa2(ii,4)+&
    1090       130720 : &   gmet(2,1)*gxa2(ii,2))
    1091              :    r1(ii,3)=gmet(1,1)*gxa2(ii,5)+gmet(2,2)*gxa2(ii,9)+&
    1092              : &   gmet(3,3)*gxa2(ii,10)+2.d0*(&
    1093              : &   gmet(3,2)*gxa2(ii,8)+gmet(3,1)*gxa2(ii,3)+&
    1094       196080 : &   gmet(2,1)*gxa2(ii,4))
    1095              :  end do
    1096              : 
    1097              : !Compute r3G(i,j,k)=gxa2(p,i,j)*gmet(p,k)
    1098              : !Write out components for 18 distinct terms, Re and Im
    1099              : !(r3G is symmetric in first two indices, not in all permutations)
    1100              : !Store as 111 221 331 321 311 211
    1101              : !112 222 332 322 312 212
    1102              : !113 223 333 323 313 213
    1103       196080 :  do ii=1,2
    1104       130720 :    r3G(ii, 1)=gmet(1,1)*gxa2(ii,1)+gmet(2,1)*gxa2(ii,6)+gmet(3,1)*gxa2(ii,5)
    1105       130720 :    r3G(ii, 2)=gmet(1,1)*gxa2(ii,2)+gmet(2,1)*gxa2(ii,7)+gmet(3,1)*gxa2(ii,9)
    1106       130720 :    r3G(ii, 3)=gmet(1,1)*gxa2(ii,3)+gmet(2,1)*gxa2(ii,8)+gmet(3,1)*gxa2(ii,10)
    1107       130720 :    r3G(ii, 4)=gmet(1,1)*gxa2(ii,4)+gmet(2,1)*gxa2(ii,9)+gmet(3,1)*gxa2(ii,8)
    1108       130720 :    r3G(ii, 5)=gmet(1,1)*gxa2(ii,5)+gmet(2,1)*gxa2(ii,4)+gmet(3,1)*gxa2(ii,3)
    1109       130720 :    r3G(ii, 6)=gmet(1,1)*gxa2(ii,6)+gmet(2,1)*gxa2(ii,2)+gmet(3,1)*gxa2(ii,4)
    1110       130720 :    r3G(ii, 7)=gmet(2,1)*gxa2(ii,1)+gmet(2,2)*gxa2(ii,6)+gmet(3,2)*gxa2(ii,5)
    1111       130720 :    r3G(ii, 8)=gmet(2,1)*gxa2(ii,2)+gmet(2,2)*gxa2(ii,7)+gmet(3,2)*gxa2(ii,9)
    1112       130720 :    r3G(ii, 9)=gmet(2,1)*gxa2(ii,3)+gmet(2,2)*gxa2(ii,8)+gmet(3,2)*gxa2(ii,10)
    1113       130720 :    r3G(ii,10)=gmet(2,1)*gxa2(ii,4)+gmet(2,2)*gxa2(ii,9)+gmet(3,2)*gxa2(ii,8)
    1114       130720 :    r3G(ii,11)=gmet(2,1)*gxa2(ii,5)+gmet(2,2)*gxa2(ii,4)+gmet(3,2)*gxa2(ii,3)
    1115       130720 :    r3G(ii,12)=gmet(2,1)*gxa2(ii,6)+gmet(2,2)*gxa2(ii,2)+gmet(3,2)*gxa2(ii,4)
    1116       130720 :    r3G(ii,13)=gmet(3,1)*gxa2(ii,1)+gmet(3,2)*gxa2(ii,6)+gmet(3,3)*gxa2(ii,5)
    1117       130720 :    r3G(ii,14)=gmet(3,1)*gxa2(ii,2)+gmet(3,2)*gxa2(ii,7)+gmet(3,3)*gxa2(ii,9)
    1118       130720 :    r3G(ii,15)=gmet(3,1)*gxa2(ii,3)+gmet(3,2)*gxa2(ii,8)+gmet(3,3)*gxa2(ii,10)
    1119       130720 :    r3G(ii,16)=gmet(3,1)*gxa2(ii,4)+gmet(3,2)*gxa2(ii,9)+gmet(3,3)*gxa2(ii,8)
    1120       130720 :    r3G(ii,17)=gmet(3,1)*gxa2(ii,5)+gmet(3,2)*gxa2(ii,4)+gmet(3,3)*gxa2(ii,3)
    1121       196080 :    r3G(ii,18)=gmet(3,1)*gxa2(ii,6)+gmet(3,2)*gxa2(ii,2)+gmet(3,3)*gxa2(ii,4)
    1122              :  end do
    1123              : 
    1124              : !Compute r3A(i,j,k)=conjg(gxa1(p,i,j))*amet(p,k)
    1125              : !Write out components for 18 distinct terms, Re and Im
    1126              : !(r3A is symmetric in first two indices, not in all permutations)
    1127              : !Store as 111 221 331 321 311 211
    1128              : !112 222 332 322 312 212
    1129              : !113 223 333 323 313 213
    1130              : !Note that, since amet is antisymmetric, amet(i,i)=0
    1131              : 
    1132              :  r3A(re, 1)=amet(re,2,1)*gxa1(re,6 )+amet(im,2,1)*gxa1(im,6 )+&
    1133        65360 : & amet(re,3,1)*gxa1(re,5 )+amet(im,3,1)*gxa1(im,5 )
    1134              :  r3A(re, 2)=amet(re,2,1)*gxa1(re,7 )+amet(im,2,1)*gxa1(im,7 )+&
    1135        65360 : & amet(re,3,1)*gxa1(re,9 )+amet(im,3,1)*gxa1(im,9 )
    1136              :  r3A(re, 3)=amet(re,2,1)*gxa1(re,8 )+amet(im,2,1)*gxa1(im,8 )+&
    1137        65360 : & amet(re,3,1)*gxa1(re,10)+amet(im,3,1)*gxa1(im,10)
    1138              :  r3A(re, 4)=amet(re,2,1)*gxa1(re,9 )+amet(im,2,1)*gxa1(im,9 )+&
    1139        65360 : & amet(re,3,1)*gxa1(re,8 )+amet(im,3,1)*gxa1(im,8 )
    1140              :  r3A(re, 5)=amet(re,2,1)*gxa1(re,4 )+amet(im,2,1)*gxa1(im,4 )+&
    1141        65360 : & amet(re,3,1)*gxa1(re,3 )+amet(im,3,1)*gxa1(im,3 )
    1142              :  r3A(re, 6)=amet(re,2,1)*gxa1(re,2 )+amet(im,2,1)*gxa1(im,2 )+&
    1143        65360 : & amet(re,3,1)*gxa1(re,4 )+amet(im,3,1)*gxa1(im,4 )
    1144              :  r3A(re, 7)=amet(re,1,2)*gxa1(re,1 )+amet(im,1,2)*gxa1(im,1 )+&
    1145        65360 : & amet(re,3,2)*gxa1(re,5 )+amet(im,3,2)*gxa1(im,5 )
    1146              :  r3A(re, 8)=amet(re,1,2)*gxa1(re,2 )+amet(im,1,2)*gxa1(im,2 )+&
    1147        65360 : & amet(re,3,2)*gxa1(re,9 )+amet(im,3,2)*gxa1(im,9 )
    1148              :  r3A(re, 9)=amet(re,1,2)*gxa1(re,3 )+amet(im,1,2)*gxa1(im,3 )+&
    1149        65360 : & amet(re,3,2)*gxa1(re,10)+amet(im,3,2)*gxa1(im,10)
    1150              :  r3A(re,10)=amet(re,1,2)*gxa1(re,4 )+amet(im,1,2)*gxa1(im,4 )+&
    1151        65360 : & amet(re,3,2)*gxa1(re,8 )+amet(im,3,2)*gxa1(im,8 )
    1152              :  r3A(re,11)=amet(re,1,2)*gxa1(re,5 )+amet(im,1,2)*gxa1(im,5 )+&
    1153        65360 : & amet(re,3,2)*gxa1(re,3 )+amet(im,3,2)*gxa1(im,3 )
    1154              :  r3A(re,12)=amet(re,1,2)*gxa1(re,6 )+amet(im,1,2)*gxa1(im,6 )+&
    1155        65360 : & amet(re,3,2)*gxa1(re,4 )+amet(im,3,2)*gxa1(im,4 )
    1156              :  r3A(re,13)=amet(re,1,3)*gxa1(re,1 )+amet(im,1,3)*gxa1(im,1 )+&
    1157        65360 : & amet(re,2,3)*gxa1(re,6 )+amet(im,2,3)*gxa1(im,6 )
    1158              :  r3A(re,14)=amet(re,1,3)*gxa1(re,2 )+amet(im,1,3)*gxa1(im,2 )+&
    1159        65360 : & amet(re,2,3)*gxa1(re,7 )+amet(im,2,3)*gxa1(im,7 )
    1160              :  r3A(re,15)=amet(re,1,3)*gxa1(re,3 )+amet(im,1,3)*gxa1(im,3 )+&
    1161        65360 : & amet(re,2,3)*gxa1(re,8 )+amet(im,2,3)*gxa1(im,8 )
    1162              :  r3A(re,16)=amet(re,1,3)*gxa1(re,4 )+amet(im,1,3)*gxa1(im,4 )+&
    1163        65360 : & amet(re,2,3)*gxa1(re,9 )+amet(im,2,3)*gxa1(im,9 )
    1164              :  r3A(re,17)=amet(re,1,3)*gxa1(re,5 )+amet(im,1,3)*gxa1(im,5 )+&
    1165        65360 : & amet(re,2,3)*gxa1(re,4 )+amet(im,2,3)*gxa1(im,4 )
    1166              :  r3A(re,18)=amet(re,1,3)*gxa1(re,6 )+amet(im,1,3)*gxa1(im,6 )+&
    1167        65360 : & amet(re,2,3)*gxa1(re,2 )+amet(im,2,3)*gxa1(im,2 )
    1168              : 
    1169              :  r3A(im, 1)=amet(im,2,1)*gxa1(re,6 )-amet(re,2,1)*gxa1(im,6 )+&
    1170        65360 : & amet(im,3,1)*gxa1(re,5 )-amet(re,3,1)*gxa1(im,5 )
    1171              :  r3A(im, 2)=amet(im,2,1)*gxa1(re,7 )-amet(re,2,1)*gxa1(im,7 )+&
    1172        65360 : & amet(im,3,1)*gxa1(re,9 )-amet(re,3,1)*gxa1(im,9 )
    1173              :  r3A(im, 3)=amet(im,2,1)*gxa1(re,8 )-amet(re,2,1)*gxa1(im,8 )+&
    1174        65360 : & amet(im,3,1)*gxa1(re,10)-amet(re,3,1)*gxa1(im,10)
    1175              :  r3A(im, 4)=amet(im,2,1)*gxa1(re,9 )-amet(re,2,1)*gxa1(im,9 )+&
    1176        65360 : & amet(im,3,1)*gxa1(re,8 )-amet(re,3,1)*gxa1(im,8 )
    1177              :  r3A(im, 5)=amet(im,2,1)*gxa1(re,4 )-amet(re,2,1)*gxa1(im,4 )+&
    1178        65360 : & amet(im,3,1)*gxa1(re,3 )-amet(re,3,1)*gxa1(im,3 )
    1179              :  r3A(im, 6)=amet(im,2,1)*gxa1(re,2 )-amet(re,2,1)*gxa1(im,2 )+&
    1180        65360 : & amet(im,3,1)*gxa1(re,4 )-amet(re,3,1)*gxa1(im,4 )
    1181              :  r3A(im, 7)=amet(im,1,2)*gxa1(re,1 )-amet(re,1,2)*gxa1(im,1 )+&
    1182        65360 : & amet(im,3,2)*gxa1(re,5 )-amet(re,3,2)*gxa1(im,5 )
    1183              :  r3A(im, 8)=amet(im,1,2)*gxa1(re,2 )-amet(re,1,2)*gxa1(im,2 )+&
    1184        65360 : & amet(im,3,2)*gxa1(re,9 )-amet(re,3,2)*gxa1(im,9 )
    1185              :  r3A(im, 9)=amet(im,1,2)*gxa1(re,3 )-amet(re,1,2)*gxa1(im,3 )+&
    1186        65360 : & amet(im,3,2)*gxa1(re,10)-amet(re,3,2)*gxa1(im,10)
    1187              :  r3A(im,10)=amet(im,1,2)*gxa1(re,4 )-amet(re,1,2)*gxa1(im,4 )+&
    1188        65360 : & amet(im,3,2)*gxa1(re,8 )-amet(re,3,2)*gxa1(im,8 )
    1189              :  r3A(im,11)=amet(im,1,2)*gxa1(re,5 )-amet(re,1,2)*gxa1(im,5 )+&
    1190        65360 : & amet(im,3,2)*gxa1(re,3 )-amet(re,3,2)*gxa1(im,3 )
    1191              :  r3A(im,12)=amet(im,1,2)*gxa1(re,6 )-amet(re,1,2)*gxa1(im,6 )+&
    1192        65360 : & amet(im,3,2)*gxa1(re,4 )-amet(re,3,2)*gxa1(im,4 )
    1193              :  r3A(im,13)=amet(im,1,3)*gxa1(re,1 )-amet(re,1,3)*gxa1(im,1 )+&
    1194        65360 : & amet(im,2,3)*gxa1(re,6 )-amet(re,2,3)*gxa1(im,6 )
    1195              :  r3A(im,14)=amet(im,1,3)*gxa1(re,2 )-amet(re,1,3)*gxa1(im,2 )+&
    1196        65360 : & amet(im,2,3)*gxa1(re,7 )-amet(re,2,3)*gxa1(im,7 )
    1197              :  r3A(im,15)=amet(im,1,3)*gxa1(re,3 )-amet(re,1,3)*gxa1(im,3 )+&
    1198        65360 : & amet(im,2,3)*gxa1(re,8 )-amet(re,2,3)*gxa1(im,8 )
    1199              :  r3A(im,16)=amet(im,1,3)*gxa1(re,4 )-amet(re,1,3)*gxa1(im,4 )+&
    1200        65360 : & amet(im,2,3)*gxa1(re,9 )-amet(re,2,3)*gxa1(im,9 )
    1201              :  r3A(im,17)=amet(im,1,3)*gxa1(re,5 )-amet(re,1,3)*gxa1(im,5 )+&
    1202        65360 : & amet(im,2,3)*gxa1(re,4 )-amet(re,2,3)*gxa1(im,4 )
    1203              :  r3A(im,18)=amet(im,1,3)*gxa1(re,6 )-amet(re,1,3)*gxa1(im,6 )+&
    1204        65360 : & amet(im,2,3)*gxa1(re,2 )-amet(re,2,3)*gxa1(im,2 )
    1205              : 
    1206              : !Compute s33(a,b)=2*Re[r3A(a,i,j)*r3G(b,j,i)]
    1207              : 
    1208              :  s33(1)=2.d0*(r3A(re, 1)*r3G(re, 1)-r3A(im, 1)*r3G(im, 1)+&
    1209              : & r3A(re,12)*r3G(re,12)-r3A(im,12)*r3G(im,12)+&
    1210              : & r3A(re,17)*r3G(re,17)-r3A(im,17)*r3G(im,17)+&
    1211              : & r3A(re,11)*r3G(re,18)-r3A(im,11)*r3G(im,18)+&
    1212              : & r3A(re,18)*r3G(re,11)-r3A(im,18)*r3G(im,11)+&
    1213              : & r3A(re, 5)*r3G(re,13)-r3A(im, 5)*r3G(im,13)+&
    1214              : & r3A(re,13)*r3G(re, 5)-r3A(im,13)*r3G(im, 5)+&
    1215              : & r3A(re, 6)*r3G(re, 7)-r3A(im, 6)*r3G(im, 7)+&
    1216        65360 : & r3A(re, 7)*r3G(re, 6)-r3A(im, 7)*r3G(im, 6))
    1217              :  s33(2)=2.d0*(r3A(re, 6)*r3G(re, 6)-r3A(im, 6)*r3G(im, 6)+&
    1218              : & r3A(re, 8)*r3G(re, 8)-r3A(im, 8)*r3G(im, 8)+&
    1219              : & r3A(re,16)*r3G(re,16)-r3A(im,16)*r3G(im,16)+&
    1220              : & r3A(re,10)*r3G(re,14)-r3A(im,10)*r3G(im,14)+&
    1221              : & r3A(re,14)*r3G(re,10)-r3A(im,14)*r3G(im,10)+&
    1222              : & r3A(re, 4)*r3G(re,18)-r3A(im, 4)*r3G(im,18)+&
    1223              : & r3A(re,18)*r3G(re, 4)-r3A(im,18)*r3G(im, 4)+&
    1224              : & r3A(re, 2)*r3G(re,12)-r3A(im, 2)*r3G(im,12)+&
    1225        65360 : & r3A(re,12)*r3G(re, 2)-r3A(im,12)*r3G(im, 2))
    1226              :  s33(3)=2.d0*(r3A(re, 5)*r3G(re, 5)-r3A(im, 5)*r3G(im, 5)+&
    1227              : & r3A(re,10)*r3G(re,10)-r3A(im,10)*r3G(im,10)+&
    1228              : & r3A(re,15)*r3G(re,15)-r3A(im,15)*r3G(im,15)+&
    1229              : & r3A(re, 9)*r3G(re,16)-r3A(im, 9)*r3G(im,16)+&
    1230              : & r3A(re,16)*r3G(re, 9)-r3A(im,16)*r3G(im, 9)+&
    1231              : & r3A(re, 3)*r3G(re,17)-r3A(im, 3)*r3G(im,17)+&
    1232              : & r3A(re,17)*r3G(re, 3)-r3A(im,17)*r3G(im, 3)+&
    1233              : & r3A(re, 4)*r3G(re,11)-r3A(im, 4)*r3G(im,11)+&
    1234        65360 : & r3A(re,11)*r3G(re, 4)-r3A(im,11)*r3G(im, 4))
    1235              :  s33(4)=2.d0*(r3A(re, 5)*r3G(re, 6)-r3A(im, 5)*r3G(im, 6)+&
    1236              : & r3A(re,10)*r3G(re, 8)-r3A(im,10)*r3G(im, 8)+&
    1237              : & r3A(re,15)*r3G(re,16)-r3A(im,15)*r3G(im,16)+&
    1238              : & r3A(re, 9)*r3G(re,14)-r3A(im, 9)*r3G(im,14)+&
    1239              : & r3A(re,16)*r3G(re,10)-r3A(im,16)*r3G(im,10)+&
    1240              : & r3A(re, 3)*r3G(re,18)-r3A(im, 3)*r3G(im,18)+&
    1241              : & r3A(re,17)*r3G(re, 4)-r3A(im,17)*r3G(im, 4)+&
    1242              : & r3A(re, 4)*r3G(re,12)-r3A(im, 4)*r3G(im,12)+&
    1243        65360 : & r3A(re,11)*r3G(re, 2)-r3A(im,11)*r3G(im, 2))
    1244              :  s33(5)=2.d0*(r3A(re, 5)*r3G(re, 1)-r3A(im, 5)*r3G(im, 1)+&
    1245              : & r3A(re,10)*r3G(re,12)-r3A(im,10)*r3G(im,12)+&
    1246              : & r3A(re,15)*r3G(re,17)-r3A(im,15)*r3G(im,17)+&
    1247              : & r3A(re, 9)*r3G(re,18)-r3A(im, 9)*r3G(im,18)+&
    1248              : & r3A(re,16)*r3G(re,11)-r3A(im,16)*r3G(im,11)+&
    1249              : & r3A(re, 3)*r3G(re,13)-r3A(im, 3)*r3G(im,13)+&
    1250              : & r3A(re,17)*r3G(re, 5)-r3A(im,17)*r3G(im, 5)+&
    1251              : & r3A(re, 4)*r3G(re, 7)-r3A(im, 4)*r3G(im, 7)+&
    1252        65360 : & r3A(re,11)*r3G(re, 6)-r3A(im,11)*r3G(im, 6))
    1253              :  s33(6)=2.d0*(r3A(re, 6)*r3G(re, 1)-r3A(im, 6)*r3G(im, 1)+&
    1254              : & r3A(re, 8)*r3G(re,12)-r3A(im, 8)*r3G(im,12)+&
    1255              : & r3A(re,16)*r3G(re,17)-r3A(im,16)*r3G(im,17)+&
    1256              : & r3A(re,10)*r3G(re,18)-r3A(im,10)*r3G(im,18)+&
    1257              : & r3A(re,14)*r3G(re,11)-r3A(im,14)*r3G(im,11)+&
    1258              : & r3A(re, 4)*r3G(re,13)-r3A(im, 4)*r3G(im,13)+&
    1259              : & r3A(re,18)*r3G(re, 5)-r3A(im,18)*r3G(im, 5)+&
    1260              : & r3A(re, 2)*r3G(re, 7)-r3A(im, 2)*r3G(im, 7)+&
    1261        65360 : & r3A(re,12)*r3G(re, 6)-r3A(im,12)*r3G(im, 6))
    1262              : 
    1263              : !Compute s31(a,b)=2*Re[r3A(a,b,i)*r1(i)]
    1264              : 
    1265              :  s31(1)=2.d0*(r1(re,1)*r3A(re, 1)-r1(im,1)*r3A(im, 1)+&
    1266              : & r1(re,2)*r3A(re, 7)-r1(im,2)*r3A(im, 7)+&
    1267        65360 : & r1(re,3)*r3A(re,13)-r1(im,3)*r3A(im,13))
    1268              :  s31(2)=2.d0*(r1(re,1)*r3A(re, 2)-r1(im,1)*r3A(im, 2)+&
    1269              : & r1(re,2)*r3A(re, 8)-r1(im,2)*r3A(im, 8)+&
    1270        65360 : & r1(re,3)*r3A(re,14)-r1(im,3)*r3A(im,14))
    1271              :  s31(3)=2.d0*(r1(re,1)*r3A(re, 3)-r1(im,1)*r3A(im, 3)+&
    1272              : & r1(re,2)*r3A(re, 9)-r1(im,2)*r3A(im, 9)+&
    1273        65360 : & r1(re,3)*r3A(re,15)-r1(im,3)*r3A(im,15))
    1274              :  s31(4)=2.d0*(r1(re,1)*r3A(re, 4)-r1(im,1)*r3A(im, 4)+&
    1275              : & r1(re,2)*r3A(re,10)-r1(im,2)*r3A(im,10)+&
    1276        65360 : & r1(re,3)*r3A(re,16)-r1(im,3)*r3A(im,16))
    1277              :  s31(5)=2.d0*(r1(re,1)*r3A(re, 5)-r1(im,1)*r3A(im, 5)+&
    1278              : & r1(re,2)*r3A(re,11)-r1(im,2)*r3A(im,11)+&
    1279        65360 : & r1(re,3)*r3A(re,17)-r1(im,3)*r3A(im,17))
    1280              :  s31(6)=2.d0*(r1(re,1)*r3A(re, 6)-r1(im,1)*r3A(im, 6)+&
    1281              : & r1(re,2)*r3A(re,12)-r1(im,2)*r3A(im,12)+&
    1282        65360 : & r1(re,3)*r3A(re,18)-r1(im,3)*r3A(im,18))
    1283              : 
    1284              : !Finally, compute rank2(a,b)=-15*s33(a,b)+3*s31(a,b)
    1285              : 
    1286       457520 :  rank2(:)=15.d0*s33(:)-3.d0*s31(:)
    1287              : 
    1288        65360 : end subroutine cont33so
    1289              : !!***
    1290              : 
    1291              : !!****f* m_contract/cont35
    1292              : !! NAME
    1293              : !! cont35
    1294              : !!
    1295              : !! FUNCTION
    1296              : !! Contract symmetric rank3 tensor gxa with rank5 symmetric tensor to
    1297              : !! produce symmetric rank2 tensor.
    1298              : !!
    1299              : !! INPUTS
    1300              : !!  gxa(2,10)=rank 3 symmetric complex tensor in order
    1301              : !!  rank5(2,21)=rank 5 complex tensor (symmetric storage)
    1302              : !!
    1303              : !! OUTPUT
    1304              : !!  rank2(6)=rank 2 real tensor (symmetric storage) 11 22 33 32 31 21.
    1305              : !!
    1306              : !! NOTES
    1307              : !! Tensors are in "symmetric" storage mode.
    1308              : !! For rank 3 tensor gxa this is
    1309              : !!     111 221 331 321 311 211 222 332 322 333;
    1310              : !! For rank 5 tensor rank5 this is
    1311              : !!     11111 22111 33111 32111 31111 21111 22211 33211 32211 33311
    1312              : !!     22221 33221 32221 33321 33331 22222 33222 32222 33322 33332 33333;
    1313              : !! For rank 2 tensor rank2 this is 11, 22, 33, 32, 31, 21;
    1314              : !! gxa and rank5 are complex; rank2 is real.
    1315              : !! Want $2 Re[contraction]$.
    1316              : !! $rank2(a,b)=2 Re[gxa(i,j,k)^"*" rank5(a,b,i,j,k)]$.
    1317              : !!
    1318              : !! Note that the input gxa is typically the result of
    1319              : !!{{\ \begin{equation}
    1320              : !! gxa(i,j,k)=[{5 \over 2} gmet(i,l) gmet(j,m) gmet(k,n) - {3 \over 2} gmet(i,j) gmet(l,m) gmet(k,n)] gxa_old(l,m)
    1321              : !!\end{equation} }}
    1322              : !! where the subroutine "metcon" already includes weights in the definition
    1323              : !! of gxa for off-diagonal elements.
    1324              : !!
    1325              : !! SOURCE
    1326              : 
    1327        70046 : subroutine cont35(gxa,rank5,rank2)
    1328              : 
    1329              : !Arguments ------------------------------------
    1330              : !arrays
    1331              :  real(dp),intent(in) :: gxa(2,10),rank5(2,21)
    1332              :  real(dp),intent(out) :: rank2(6)
    1333              : 
    1334              : !Local variables-------------------------------
    1335              : !scalars
    1336              :  integer,parameter :: im=2,re=1
    1337              : 
    1338              : ! *************************************************************************
    1339              : 
    1340              : !Simply write out index summations
    1341              : 
    1342              : !a=1, b=1 in rank2(a,b) --> maps to index 1
    1343              :  rank2(1)=2.0d0*(&
    1344              : & gxa(re, 1)*rank5(re, 1)+gxa(im, 1)*rank5(im, 1)+&
    1345              : & gxa(re, 7)*rank5(re, 7)+gxa(im, 7)*rank5(im, 7)+&
    1346              : & gxa(re,10)*rank5(re,10)+gxa(im,10)*rank5(im,10)+&
    1347              : & gxa(re, 2)*rank5(re, 2)+gxa(im, 2)*rank5(im, 2)+&
    1348              : & gxa(re, 3)*rank5(re, 3)+gxa(im, 3)*rank5(im, 3)+&
    1349              : & gxa(re, 5)*rank5(re, 5)+gxa(im, 5)*rank5(im, 5)+&
    1350              : & gxa(re, 6)*rank5(re, 6)+gxa(im, 6)*rank5(im, 6)+&
    1351              : & gxa(re, 8)*rank5(re, 8)+gxa(im, 8)*rank5(im, 8)+&
    1352              : & gxa(re, 9)*rank5(re, 9)+gxa(im, 9)*rank5(im, 9)+&
    1353        70046 : & gxa(re, 4)*rank5(re, 4)+gxa(im, 4)*rank5(im, 4))
    1354              : 
    1355              : 
    1356              : !a=2, b=2 in rank2(a,b) --> maps to index 2
    1357              :  rank2(2)=2.0d0*(&
    1358              : & gxa(re, 1)*rank5(re, 2)+gxa(im, 1)*rank5(im, 2)+&
    1359              : & gxa(re, 7)*rank5(re,16)+gxa(im, 7)*rank5(im,16)+&
    1360              : & gxa(re,10)*rank5(re,19)+gxa(im,10)*rank5(im,19)+&
    1361              : & gxa(re, 2)*rank5(re,11)+gxa(im, 2)*rank5(im,11)+&
    1362              : & gxa(re, 3)*rank5(re,12)+gxa(im, 3)*rank5(im,12)+&
    1363              : & gxa(re, 5)*rank5(re, 9)+gxa(im, 5)*rank5(im, 9)+&
    1364              : & gxa(re, 6)*rank5(re, 7)+gxa(im, 6)*rank5(im, 7)+&
    1365              : & gxa(re, 8)*rank5(re,17)+gxa(im, 8)*rank5(im,17)+&
    1366              : & gxa(re, 9)*rank5(re,18)+gxa(im, 9)*rank5(im,18)+&
    1367        70046 : & gxa(re, 4)*rank5(re,13)+gxa(im, 4)*rank5(im,13))
    1368              : 
    1369              : !a=3, b=3 in rank2(a,b) --> maps to index 3
    1370              :  rank2(3)=2.0d0*(&
    1371              : & gxa(re, 1)*rank5(re, 3)+gxa(im, 1)*rank5(im, 3)+&
    1372              : & gxa(re, 7)*rank5(re,17)+gxa(im, 7)*rank5(im,17)+&
    1373              : & gxa(re,10)*rank5(re,21)+gxa(im,10)*rank5(im,21)+&
    1374              : & gxa(re, 2)*rank5(re,12)+gxa(im, 2)*rank5(im,12)+&
    1375              : & gxa(re, 3)*rank5(re,15)+gxa(im, 3)*rank5(im,15)+&
    1376              : & gxa(re, 5)*rank5(re,10)+gxa(im, 5)*rank5(im,10)+&
    1377              : & gxa(re, 6)*rank5(re, 8)+gxa(im, 6)*rank5(im, 8)+&
    1378              : & gxa(re, 8)*rank5(re,20)+gxa(im, 8)*rank5(im,20)+&
    1379              : & gxa(re, 9)*rank5(re,19)+gxa(im, 9)*rank5(im,19)+&
    1380        70046 : & gxa(re, 4)*rank5(re,14)+gxa(im, 4)*rank5(im,14))
    1381              : 
    1382              : !a=3, b=2 in rank2(a,b) --> maps to index 4
    1383              :  rank2(4)=2.0d0*(&
    1384              : & gxa(re, 1)*rank5(re, 4)+gxa(im, 1)*rank5(im, 4)+&
    1385              : & gxa(re, 7)*rank5(re,18)+gxa(im, 7)*rank5(im,18)+&
    1386              : & gxa(re,10)*rank5(re,20)+gxa(im,10)*rank5(im,20)+&
    1387              : & gxa(re, 2)*rank5(re,13)+gxa(im, 2)*rank5(im,13)+&
    1388              : & gxa(re, 3)*rank5(re,14)+gxa(im, 3)*rank5(im,14)+&
    1389              : & gxa(re, 5)*rank5(re, 8)+gxa(im, 5)*rank5(im, 8)+&
    1390              : & gxa(re, 6)*rank5(re, 9)+gxa(im, 6)*rank5(im, 9)+&
    1391              : & gxa(re, 8)*rank5(re,19)+gxa(im, 8)*rank5(im,19)+&
    1392              : & gxa(re, 9)*rank5(re,17)+gxa(im, 9)*rank5(im,17)+&
    1393        70046 : & gxa(re, 4)*rank5(re,12)+gxa(im, 4)*rank5(im,12))
    1394              : 
    1395              : !a=3, b=1 in rank2(a,b) --> maps to index 5
    1396              :  rank2(5)=2.0d0*(&
    1397              : & gxa(re, 1)*rank5(re, 5)+gxa(im, 1)*rank5(im, 5)+&
    1398              : & gxa(re, 7)*rank5(re,13)+gxa(im, 7)*rank5(im,13)+&
    1399              : & gxa(re,10)*rank5(re,15)+gxa(im,10)*rank5(im,15)+&
    1400              : & gxa(re, 2)*rank5(re, 9)+gxa(im, 2)*rank5(im, 9)+&
    1401              : & gxa(re, 3)*rank5(re,10)+gxa(im, 3)*rank5(im,10)+&
    1402              : & gxa(re, 5)*rank5(re, 3)+gxa(im, 5)*rank5(im, 3)+&
    1403              : & gxa(re, 6)*rank5(re, 4)+gxa(im, 6)*rank5(im, 4)+&
    1404              : & gxa(re, 8)*rank5(re,14)+gxa(im, 8)*rank5(im,14)+&
    1405              : & gxa(re, 9)*rank5(re,12)+gxa(im, 9)*rank5(im,12)+&
    1406        70046 : & gxa(re, 4)*rank5(re, 8)+gxa(im, 4)*rank5(im, 8))
    1407              : 
    1408              : !a=2, b=1 in rank2(a,b) --> maps to index 6
    1409              :  rank2(6)=2.0d0*(&
    1410              : & gxa(re, 1)*rank5(re, 6)+gxa(im, 1)*rank5(im, 6)+&
    1411              : & gxa(re, 7)*rank5(re,11)+gxa(im, 7)*rank5(im,11)+&
    1412              : & gxa(re,10)*rank5(re,14)+gxa(im,10)*rank5(im,14)+&
    1413              : & gxa(re, 2)*rank5(re, 7)+gxa(im, 2)*rank5(im, 7)+&
    1414              : & gxa(re, 3)*rank5(re, 8)+gxa(im, 3)*rank5(im, 8)+&
    1415              : & gxa(re, 5)*rank5(re, 4)+gxa(im, 5)*rank5(im, 4)+&
    1416              : & gxa(re, 6)*rank5(re, 2)+gxa(im, 6)*rank5(im, 2)+&
    1417              : & gxa(re, 8)*rank5(re,12)+gxa(im, 8)*rank5(im,12)+&
    1418              : & gxa(re, 9)*rank5(re,13)+gxa(im, 9)*rank5(im,13)+&
    1419        70046 : & gxa(re, 4)*rank5(re, 9)+gxa(im, 4)*rank5(im, 9))
    1420              : 
    1421        70046 : end subroutine cont35
    1422              : !!***
    1423              : 
    1424              : !!****f* m_contract/metcon
    1425              : !! NAME
    1426              : !! metcon
    1427              : !!
    1428              : !! FUNCTION
    1429              : !! Carries out specialized metric tensor contractions needed for
    1430              : !! l=0,1,2,3 nonlocal Kleinman-Bylander pseudopotential operation.
    1431              : !! Full advantage is taken of the full permutational symmetry of these
    1432              : !! tensors.
    1433              : !!
    1434              : !! INPUTS
    1435              : !!  rank=0,1,2, or 3 = rank of input tensor aa
    1436              : !!  gmet(3,3)=metric tensor (array is symmetric but stored as 3x3)
    1437              : !!  aa(2,(rank+1)*(rank+2)/2)=unique elements of complex input tensor
    1438              : !!
    1439              : !! OUTPUT
    1440              : !!  bb(2,(rank+1)*(rank+2)/2)=unique elements of complex output tensor
    1441              : !!
    1442              : !! NOTES
    1443              : !! All tensors are stored in a compressed storage mode defined below;
    1444              : !! input and output conform to this scheme.
    1445              : !! When tensor elements occur repeatedly due to symmetry, the
    1446              : !! WEIGHT IS INCLUDED in the output tensor element to simplify later
    1447              : !! contractions with other tensors of the same rank and form, i.e. the
    1448              : !! next contraction is then simply a dot product over the unique elements.
    1449              : !!
    1450              : !! Definitions of the contractions:
    1451              : !!
    1452              : !! rank=0:  bb = aa  (simply copy the scalar value, no use of gmet)
    1453              : !!
    1454              : !! rank=1:  bb(i)= $gmet(i,l) aa(l)$  (3 elements in, 3 elements out)
    1455              : !!
    1456              : !! rank=2:  bb(i,j)= $[{3 \over 2} gmet(i,l) gmet(j,m) - {1 \over 2} gmet(i,j) gmet(l,m)] aa(l,m)$
    1457              : !!          (6 elements in, 6 elements out)
    1458              : !!
    1459              : !! rank=3:  bb(i,j,k)= $[{5 \over 2} g(i,l) g(j,m) g(k,n) - {3 \over 2} g(i,j) g(l,m) g(k,n)] aa(l,m,n)$
    1460              : !!          (10 elements in, 10 elements out)
    1461              : !!         In this rank 3 case, the second term is NOT symmetric in all
    1462              : !!         permutations of i,j,k, but the final tensor b(ijk) may be
    1463              : !!         symmetrized over all permutations because it will be
    1464              : !!         contracted with a completely symmetric tensor.
    1465              : !!
    1466              : !! The compressed storage scheme is based on storing a symmetric 3x3 matrix as
    1467              : !!     (1 . .)
    1468              : !!     (6 2 .)
    1469              : !!     (5 4 3)
    1470              : !! which leads to the following mappings for all ranks
    1471              : !! where the compressed storage index is to the right of the arrow:
    1472              : !! rank=0 1->1 (only a scalar)
    1473              : !! rank=1 1->1 2->2 3->3 (standard vector, no compression)
    1474              : !! rank=2 11->1 22->2 33->3 32->4 31->5 21->6
    1475              : !!  weights   1     1     1     2     2     2
    1476              : !! rank=3 111->1 221->2 331->3 321->4 311->5 211->6 222->7 332->8 322->9 333->10
    1477              : !!  weights    1      3      3      6      3      3      1      3      3       1
    1478              : !!
    1479              : !! SOURCE
    1480              : 
    1481    292310138 : subroutine metcon(rank,gmet,aa,bb)
    1482              : 
    1483              : !Arguments ------------------------------------
    1484              : !scalars
    1485              :  integer,intent(in) :: rank
    1486              : !arrays
    1487              :  real(dp),intent(in) :: aa(2,((rank+1)*(rank+2))/2),gmet(3,3)
    1488              :  real(dp),intent(out) :: bb(2,((rank+1)*(rank+2))/2)
    1489              : 
    1490              : !Local variables-------------------------------
    1491              : !scalars
    1492              :  integer :: ii,jj
    1493              :  real(dp) :: scalar,tmpiii,tmpijk
    1494              :  character(len=500) :: message
    1495              : !arrays
    1496              :  real(dp) :: vector(3)
    1497              : 
    1498              : ! *************************************************************************
    1499              : 
    1500              : !This statement function defines the l=3 contraction in
    1501              : !terms of the free indices of the contracted tensor (re and im)
    1502              : ! coniii(ii,i1,i2,i3)=gmet(i1,1)*gmet(i2,1)*gmet(i3,1)*aa(ii,1)+&
    1503              : !& gmet(i1,2)*gmet(i2,2)*gmet(i3,2)*aa(ii,7)+&
    1504              : !& gmet(i1,3)*gmet(i2,3)*gmet(i3,3)*aa(ii,10)
    1505              : ! conijk(ii,i1,i2,i3)=aa(ii,4)*&
    1506              : !& (gmet(i1,1)*gmet(i2,2)*gmet(i3,3)+&
    1507              : !& gmet(i1,2)*gmet(i2,3)*gmet(i3,1)+&
    1508              : !& gmet(i1,3)*gmet(i2,1)*gmet(i3,2)+&
    1509              : !& gmet(i1,3)*gmet(i2,2)*gmet(i3,1)+&
    1510              : !& gmet(i1,1)*gmet(i2,3)*gmet(i3,2)+&
    1511              : !& gmet(i1,2)*gmet(i2,1)*gmet(i3,3))
    1512              : ! con(ii,i1,i2,i3)=coniii(ii,i1,i2,i3)+conijk(ii,i1,i2,i3)+&
    1513              : !& (gmet(i1,1)*gmet(i2,2)*gmet(i3,1)+&
    1514              : !& gmet(i1,2)*gmet(i2,1)*gmet(i3,1)+&
    1515              : !& gmet(i1,1)*gmet(i2,1)*gmet(i3,2))*aa(ii,6)+&
    1516              : !& (gmet(i1,1)*gmet(i2,2)*gmet(i3,2)+&
    1517              : !& gmet(i1,2)*gmet(i2,1)*gmet(i3,2)+&
    1518              : !& gmet(i1,2)*gmet(i2,2)*gmet(i3,1))*aa(ii,2)+&
    1519              : !& (gmet(i1,1)*gmet(i2,3)*gmet(i3,1)+&
    1520              : !& gmet(i1,3)*gmet(i2,1)*gmet(i3,1)+&
    1521              : !& gmet(i1,1)*gmet(i2,1)*gmet(i3,3))*aa(ii,5)+&
    1522              : !& (gmet(i1,1)*gmet(i2,3)*gmet(i3,3)+&
    1523              : !& gmet(i1,3)*gmet(i2,1)*gmet(i3,3)+&
    1524              : !& gmet(i1,3)*gmet(i2,3)*gmet(i3,1))*aa(ii,3)+&
    1525              : !& (gmet(i1,2)*gmet(i2,2)*gmet(i3,3)+&
    1526              : !& gmet(i1,2)*gmet(i2,3)*gmet(i3,2)+&
    1527              : !& gmet(i1,3)*gmet(i2,2)*gmet(i3,2))*aa(ii,9)+&
    1528              : !& (gmet(i1,2)*gmet(i2,3)*gmet(i3,3)+&
    1529              : !& gmet(i1,3)*gmet(i2,2)*gmet(i3,3)+&
    1530              : !& gmet(i1,3)*gmet(i2,3)*gmet(i3,2))*aa(ii,8)
    1531              : 
    1532              : !DEBUG
    1533              : !write(std_out,*)' metcon : enter '
    1534              : !stop
    1535              : !ENDDEBUG
    1536    292310138 :  if (rank==0) then
    1537              : !  Simply copy scalar, re and im
    1538    115183099 :    bb(1,1)=aa(1,1)
    1539    115183099 :    bb(2,1)=aa(2,1)
    1540              : 
    1541    177127039 :  else if (rank==1) then
    1542              : !  Apply gmet to input vector, re and im
    1543    325552500 :    do ii=1,2
    1544    976657500 :      do jj=1,3
    1545    868140000 :        bb(ii,jj)=gmet(jj,1)*aa(ii,1)+gmet(jj,2)*aa(ii,2)+gmet(jj,3)*aa(ii,3)
    1546              :      end do
    1547              :    end do
    1548              : 
    1549              : 
    1550     68609539 :  else if (rank==2) then
    1551              : !  Apply rank2 expression, re and im
    1552    203505462 :    do ii=1,2
    1553              : !    Carry out g(c,d)*aa(c,d) contraction to get scalar
    1554              :      scalar=gmet(1,1)*aa(ii,1)+gmet(2,2)*aa(ii,2)+&
    1555              : &     gmet(3,3)*aa(ii,3)+2.0d0*(gmet(2,1)*aa(ii,6)+&
    1556    135670308 : &     gmet(3,1)*aa(ii,5)+gmet(3,2)*aa(ii,4) )
    1557              : !    Write out components of contraction
    1558              : !    (1,1)->1
    1559              :      bb(ii,1)=0.5d0*(3.0d0*(gmet(1,1)*gmet(1,1)*aa(ii,1)+&
    1560              : &     gmet(1,2)*gmet(1,2)*aa(ii,2)+gmet(1,3)*gmet(1,3)*aa(ii,3)+&
    1561              : &     (gmet(1,2)*gmet(1,1)+gmet(1,1)*gmet(1,2))*aa(ii,6)+&
    1562              : &     (gmet(1,3)*gmet(1,1)+gmet(1,1)*gmet(1,3))*aa(ii,5)+&
    1563              : &     (gmet(1,3)*gmet(1,2)+gmet(1,2)*gmet(1,3))*aa(ii,4) ) &
    1564    135670308 : &     - gmet(1,1)*scalar)
    1565              : !    (2,2)->2
    1566              :      bb(ii,2)=0.5d0*(3.0d0*(gmet(2,1)*gmet(2,1)*aa(ii,1)+&
    1567              : &     gmet(2,2)*gmet(2,2)*aa(ii,2)+gmet(2,3)*gmet(2,3)*aa(ii,3)+&
    1568              : &     (gmet(2,2)*gmet(2,1)+gmet(2,1)*gmet(2,2))*aa(ii,6)+&
    1569              : &     (gmet(2,3)*gmet(2,1)+gmet(2,1)*gmet(2,3))*aa(ii,5)+&
    1570              : &     (gmet(2,3)*gmet(2,2)+gmet(2,2)*gmet(2,3))*aa(ii,4) )&
    1571    135670308 : &     - gmet(2,2)*scalar)
    1572              : !    (3,3)->3
    1573              :      bb(ii,3)=0.5d0*(3.0d0*(gmet(3,1)*gmet(3,1)*aa(ii,1)+&
    1574              : &     gmet(3,2)*gmet(3,2)*aa(ii,2)+gmet(3,3)*gmet(3,3)*aa(ii,3)+&
    1575              : &     (gmet(3,2)*gmet(3,1)+gmet(3,1)*gmet(3,2))*aa(ii,6)+&
    1576              : &     (gmet(3,3)*gmet(3,1)+gmet(3,1)*gmet(3,3))*aa(ii,5)+&
    1577              : &     (gmet(3,3)*gmet(3,2)+gmet(3,2)*gmet(3,3))*aa(ii,4) )&
    1578    135670308 : &     - gmet(3,3)*scalar)
    1579              : !    (3,2)->4
    1580              :      bb(ii,4)=0.5d0*(3.0d0*(gmet(3,1)*gmet(2,1)*aa(ii,1)+&
    1581              : &     gmet(3,2)*gmet(2,2)*aa(ii,2)+gmet(3,3)*gmet(2,3)*aa(ii,3)+&
    1582              : &     (gmet(3,2)*gmet(2,1)+gmet(3,1)*gmet(2,2))*aa(ii,6)+&
    1583              : &     (gmet(3,3)*gmet(2,1)+gmet(3,1)*gmet(2,3))*aa(ii,5)+&
    1584              : &     (gmet(3,3)*gmet(2,2)+gmet(3,2)*gmet(2,3))*aa(ii,4) )&
    1585    135670308 : &     - gmet(3,2)*scalar)
    1586              : !    (3,1)->5
    1587              :      bb(ii,5)=0.5d0*(3.0d0*(gmet(3,1)*gmet(1,1)*aa(ii,1)+&
    1588              : &     gmet(3,2)*gmet(1,2)*aa(ii,2)+gmet(3,3)*gmet(1,3)*aa(ii,3)+&
    1589              : &     (gmet(3,2)*gmet(1,1)+gmet(3,1)*gmet(1,2))*aa(ii,6)+&
    1590              : &     (gmet(3,3)*gmet(1,1)+gmet(3,1)*gmet(1,3))*aa(ii,5)+&
    1591              : &     (gmet(3,3)*gmet(1,2)+gmet(3,2)*gmet(1,3))*aa(ii,4) )&
    1592    135670308 : &     - gmet(3,1)*scalar)
    1593              : !    (2,1)->6
    1594              :      bb(ii,6)=0.5d0*(3.0d0*(gmet(2,1)*gmet(1,1)*aa(ii,1)+&
    1595              : &     gmet(2,2)*gmet(1,2)*aa(ii,2)+gmet(2,3)*gmet(1,3)*aa(ii,3)+&
    1596              : &     (gmet(2,2)*gmet(1,1)+gmet(2,1)*gmet(1,2))*aa(ii,6)+&
    1597              : &     (gmet(2,3)*gmet(1,1)+gmet(2,1)*gmet(1,3))*aa(ii,5)+&
    1598              : &     (gmet(2,3)*gmet(1,2)+gmet(2,2)*gmet(1,3))*aa(ii,4) ) &
    1599    135670308 : &     - gmet(2,1)*scalar)
    1600              : !    Include appropriate weights for multiplicity
    1601    135670308 :      bb(ii,4)=2.d0*bb(ii,4)
    1602    135670308 :      bb(ii,5)=2.d0*bb(ii,5)
    1603    203505462 :      bb(ii,6)=2.d0*bb(ii,6)
    1604              :    end do
    1605              : 
    1606       774385 :  else if (rank==3) then
    1607              : !  Apply rank2 expression, re and im
    1608      2323155 :    do ii=1,2
    1609              : !    Carry out g(l,m)g(j,n)*aa(l,m,n) contraction to get vector(j)
    1610      6195080 :      do jj=1,3
    1611              :        tmpiii=   gmet(1,1)*gmet(jj,1)*aa(ii,1)+&
    1612              : &       gmet(2,2)*gmet(jj,2)*aa(ii,7)+&
    1613      4646310 : &       gmet(3,3)*gmet(jj,3)*aa(ii,10)
    1614              :        tmpijk=  (gmet(1,2)*gmet(jj,3)+&
    1615              : &       gmet(3,1)*gmet(jj,2)+&
    1616              : &       gmet(2,3)*gmet(jj,1)+&
    1617              : &       gmet(3,2)*gmet(jj,1)+&
    1618              : &       gmet(1,3)*gmet(jj,2)+&
    1619      4646310 : &       gmet(2,1)*gmet(jj,3)) *aa(ii,4)
    1620              :        vector(jj)=tmpiii + tmpijk +&
    1621              : &       (gmet(1,2)*gmet(jj,1)+&
    1622              : &       gmet(2,1)*gmet(jj,1)+&
    1623              : &       gmet(1,1)*gmet(jj,2)) *aa(ii,6)+&
    1624              : &       (gmet(1,2)*gmet(jj,2)+&
    1625              : &       gmet(2,1)*gmet(jj,2)+&
    1626              : &       gmet(2,2)*gmet(jj,1)) *aa(ii,2)+&
    1627              : &       (gmet(1,3)*gmet(jj,1)+&
    1628              : &       gmet(3,1)*gmet(jj,1)+&
    1629              : &       gmet(1,1)*gmet(jj,3)) *aa(ii,5)+&
    1630              : &       (gmet(1,3)*gmet(jj,3)+&
    1631              : &       gmet(3,1)*gmet(jj,3)+&
    1632              : &       gmet(3,3)*gmet(jj,1)) *aa(ii,3)+&
    1633              : &       (gmet(2,3)*gmet(jj,2)+&
    1634              : &       gmet(3,2)*gmet(jj,2)+&
    1635              : &       gmet(2,2)*gmet(jj,3)) *aa(ii,9)+&
    1636              : &       (gmet(2,3)*gmet(jj,3)+&
    1637              : &       gmet(3,2)*gmet(jj,3)+&
    1638      6195080 : &       gmet(3,3)*gmet(jj,2)) *aa(ii,8)
    1639              :      end do
    1640              : !    Write out components of contraction
    1641              : !    (111)->1
    1642      1548770 :      bb(ii,1) =2.5d0*con_met(ii,1,1,1)-1.5d0*(gmet(1,1)*vector(1))
    1643              : !    (221)->2
    1644              :      bb(ii,2) =2.5d0*con_met(ii,2,2,1)-0.5d0*(gmet(1,2)*vector(2)+&
    1645      1548770 : &     gmet(1,2)*vector(2)+gmet(2,2)*vector(1))
    1646              : !    (331)->3
    1647              :      bb(ii,3) =2.5d0*con_met(ii,3,3,1)-0.5d0*(gmet(1,3)*vector(3)+&
    1648      1548770 : &     gmet(1,3)*vector(3)+gmet(3,3)*vector(1))
    1649              : !    (321)->4
    1650              :      bb(ii,4) =2.5d0*con_met(ii,3,2,1)-0.5d0*(gmet(1,3)*vector(2)+&
    1651      1548770 : &     gmet(1,2)*vector(3)+gmet(3,2)*vector(1))
    1652              : !    (311)->5
    1653              :      bb(ii,5) =2.5d0*con_met(ii,3,1,1)-0.5d0*(gmet(1,3)*vector(1)+&
    1654      1548770 : &     gmet(1,1)*vector(3)+gmet(3,1)*vector(1))
    1655              : !    (211)->6
    1656              :      bb(ii,6) =2.5d0*con_met(ii,2,1,1)-0.5d0*(gmet(1,2)*vector(1)+&
    1657      1548770 : &     gmet(1,1)*vector(2)+gmet(2,1)*vector(1))
    1658              : !    (222)->7
    1659      1548770 :      bb(ii,7) =2.5d0*con_met(ii,2,2,2)-1.5d0*(gmet(2,2)*vector(2))
    1660              : 
    1661              : !    (332)->8
    1662              :      bb(ii,8) =2.5d0*con_met(ii,3,3,2)-0.5d0*(gmet(2,3)*vector(3)+&
    1663      1548770 : &     gmet(2,3)*vector(3)+gmet(3,3)*vector(2))
    1664              : !    (322)->9
    1665              :      bb(ii,9) =2.5d0*con_met(ii,3,2,2)-0.5d0*(gmet(2,3)*vector(2)+&
    1666      1548770 : &     gmet(2,2)*vector(3)+gmet(3,2)*vector(2))
    1667              : !    (333)->10
    1668      1548770 :      bb(ii,10)=2.5d0*con_met(ii,3,3,3)-1.5d0*(gmet(3,3)*vector(3))
    1669              : !    Include appropriate weights for multiplicity
    1670      1548770 :      bb(ii,2)=3.d0*bb(ii,2)
    1671      1548770 :      bb(ii,3)=3.d0*bb(ii,3)
    1672      1548770 :      bb(ii,4)=6.d0*bb(ii,4)
    1673      1548770 :      bb(ii,5)=3.d0*bb(ii,5)
    1674      1548770 :      bb(ii,6)=3.d0*bb(ii,6)
    1675      1548770 :      bb(ii,8)=3.d0*bb(ii,8)
    1676      2323155 :      bb(ii,9)=3.d0*bb(ii,9)
    1677              :    end do
    1678              : 
    1679              :  else
    1680              :    write(message, '(a,i0,a,a,a)' )&
    1681            0 : &   'Input rank=',rank,' not allowed.',ch10,&
    1682            0 : &   'Possible values are 0,1,2,3 only.'
    1683            0 :    ABI_BUG(message)
    1684              :  end if
    1685              : 
    1686              :  contains
    1687              : 
    1688     15487700 :    function con_met(ii,i1,i2,i3)
    1689              : 
    1690              :    real(dp) :: con_met
    1691              :    integer :: ii,i1,i2,i3
    1692              :    real(dp)::coniii,conijk
    1693              : 
    1694              :    coniii=gmet(i1,1)*gmet(i2,1)*gmet(i3,1)*aa(ii,1)+&
    1695              : &   gmet(i1,2)*gmet(i2,2)*gmet(i3,2)*aa(ii,7)+&
    1696     15487700 : &   gmet(i1,3)*gmet(i2,3)*gmet(i3,3)*aa(ii,10)
    1697              :    conijk=aa(ii,4)*&
    1698              : &   (gmet(i1,1)*gmet(i2,2)*gmet(i3,3)+&
    1699              : &   gmet(i1,2)*gmet(i2,3)*gmet(i3,1)+&
    1700              : &   gmet(i1,3)*gmet(i2,1)*gmet(i3,2)+&
    1701              : &   gmet(i1,3)*gmet(i2,2)*gmet(i3,1)+&
    1702              : &   gmet(i1,1)*gmet(i2,3)*gmet(i3,2)+&
    1703     15487700 : &   gmet(i1,2)*gmet(i2,1)*gmet(i3,3))
    1704              :    con_met=coniii+conijk+&
    1705              : &   (gmet(i1,1)*gmet(i2,2)*gmet(i3,1)+&
    1706              : &   gmet(i1,2)*gmet(i2,1)*gmet(i3,1)+&
    1707              : &   gmet(i1,1)*gmet(i2,1)*gmet(i3,2))*aa(ii,6)+&
    1708              : &   (gmet(i1,1)*gmet(i2,2)*gmet(i3,2)+&
    1709              : &   gmet(i1,2)*gmet(i2,1)*gmet(i3,2)+&
    1710              : &   gmet(i1,2)*gmet(i2,2)*gmet(i3,1))*aa(ii,2)+&
    1711              : &   (gmet(i1,1)*gmet(i2,3)*gmet(i3,1)+&
    1712              : &   gmet(i1,3)*gmet(i2,1)*gmet(i3,1)+&
    1713              : &   gmet(i1,1)*gmet(i2,1)*gmet(i3,3))*aa(ii,5)+&
    1714              : &   (gmet(i1,1)*gmet(i2,3)*gmet(i3,3)+&
    1715              : &   gmet(i1,3)*gmet(i2,1)*gmet(i3,3)+&
    1716              : &   gmet(i1,3)*gmet(i2,3)*gmet(i3,1))*aa(ii,3)+&
    1717              : &   (gmet(i1,2)*gmet(i2,2)*gmet(i3,3)+&
    1718              : &   gmet(i1,2)*gmet(i2,3)*gmet(i3,2)+&
    1719              : &   gmet(i1,3)*gmet(i2,2)*gmet(i3,2))*aa(ii,9)+&
    1720              : &   (gmet(i1,2)*gmet(i2,3)*gmet(i3,3)+&
    1721              : &   gmet(i1,3)*gmet(i2,2)*gmet(i3,3)+&
    1722     15487700 : &   gmet(i1,3)*gmet(i2,3)*gmet(i3,2))*aa(ii,8)
    1723              : 
    1724     15487700 :  end function con_met
    1725              : 
    1726              : end subroutine metcon
    1727              : !!***
    1728              : 
    1729              : !!****f* m_contract/metcon_so
    1730              : !! NAME
    1731              : !! metcon_so
    1732              : !!
    1733              : !! FUNCTION
    1734              : !! Carries out specialized metric tensor contractions needed for
    1735              : !! l=0,1,2,3 nonlocal Kleinman-Bylander pseudopotential operation
    1736              : !! in the spin-orbit case.
    1737              : !! Full advantage is taken of the full permutational symmetry of these tensors.
    1738              : !!
    1739              : !! INPUTS
    1740              : !!  rank=0,1,2, or 3 = rank of input tensor aa
    1741              : !!  gmet(3,3)=metric tensor (array is symmetric but stored as 3x3)
    1742              : !!  amet(3,3)=real or imaginary part of one spin matrix element of the
    1743              : !!            "spin metric" tensor
    1744              : !!  aa(2,(rank+1)*(rank+2)/2)=unique elements of complex input tensor
    1745              : !!
    1746              : !! OUTPUT
    1747              : !!  bb(2,(rank+1)*(rank+2)/2)=unique elements of complex output tensor
    1748              : !!
    1749              : !! NOTES
    1750              : !! All tensors are stored in a compressed storage mode defined below;
    1751              : !! input and output conform to this scheme.
    1752              : !! When tensor elements occur repeatedly due to symmetry, the
    1753              : !! WEIGHT IS INCLUDED in the output tensor element to simplify later
    1754              : !! contractions with other tensors of the same rank and form, i.e. the
    1755              : !! next contraction is then simply a dot product over the unique elements.
    1756              : !!
    1757              : !! Definitions of the contractions:
    1758              : !!
    1759              : !! rank=0:  bb=0
    1760              : !!
    1761              : !! rank=1:  bb(i)= $amet(i,l) aa(l)$  (3 elements in, 3 elements out)
    1762              : !!
    1763              : !! rank=2:  bb(i,j)= $[3 gmet(i,l) amet(j,m)] aa(l,m)$
    1764              : !!          (6 elements in, 6 elements out)
    1765              : !!
    1766              : !! rank=3:  bb(i,j,k)= $[{15 \over 2} g(i,l) g(j,m) a(k,n) - {3 \over 2} g(i,j) g(l,m) a(k,n)] aa(l,m,n)$
    1767              : !!          (10 elements in, 10 elements out)
    1768              : !!          In this rank 3 case, the second term is NOT symmetric in all
    1769              : !!          permutations of i,j,k, but the final tensor b(ijk) may be
    1770              : !!          symmetrized over all permutations because it will be
    1771              : !!          contracted with a completely symmetric tensor.
    1772              : !!
    1773              : !! The compressed storage scheme is based on storing
    1774              : !! a symmetric 3x3 matrix as
    1775              : !!     (1 . .)
    1776              : !!     (6 2 .)
    1777              : !!     (5 4 3)
    1778              : !! which leads to the following mappings for all ranks
    1779              : !! where the compressed storage index is to the right of the arrow:
    1780              : !! rank=0 1->1 (only a scalar)
    1781              : !! rank=1 1->1 2->2 3->3 (standard vector, no compression)
    1782              : !! rank=2 11->1 22->2 33->3 32->4 31->5 21->6
    1783              : !!  weights   1     1     1     2     2     2
    1784              : !! rank=3 111->1 221->2 331->3 321->4 311->5 211->6 222->7 332->8 322->9 333->10
    1785              : !!  weights    1      3      3      6      3      3      1      3      3       1
    1786              : !!
    1787              : !! SOURCE
    1788              : 
    1789    276604864 : subroutine metcon_so(rank,gmet,amet,aa,bb)
    1790              : 
    1791              : !Arguments ------------------------------------
    1792              : !scalars
    1793              :  integer,intent(in) :: rank
    1794              : !arrays
    1795              :  real(dp),intent(in) :: aa(2,((rank+1)*(rank+2))/2),amet(3,3),gmet(3,3)
    1796              :  real(dp),intent(out) :: bb(2,((rank+1)*(rank+2))/2)
    1797              : 
    1798              : !Local variables-------------------------------
    1799              : !scalars
    1800              :  integer :: ii,jj
    1801              :  real(dp) :: tmpiii,tmpijk
    1802              :  character(len=500) :: message
    1803              : !arrays
    1804              :  real(dp) :: vector(3)
    1805              : 
    1806              : ! *************************************************************************
    1807              : 
    1808    276604864 :  if (rank==0) then
    1809              : !  Simply copy scalar, re and im
    1810            0 :    bb(1,1)=0.d0
    1811            0 :    bb(2,1)=0.d0
    1812              : !
    1813    276604864 :  else if (rank==1) then
    1814              : !  Apply gmet to input vector, re and im
    1815    449117088 :    do ii=1,2
    1816   1347351264 :      do jj=1,3
    1817   1197645568 :        bb(ii,jj)=amet(jj,1)*aa(ii,1)+amet(jj,2)*aa(ii,2)+amet(jj,3)*aa(ii,3)
    1818              :      end do
    1819              :    end do
    1820              : 
    1821    126899168 :  else if (rank==2) then
    1822              : !  Apply rank2 expression, re and im
    1823    377305056 :    do ii=1,2
    1824              : !    Write out components of contraction
    1825              : !    (1,1)->1
    1826              :      bb(ii,1)=3.0d0*(gmet(1,1)*amet(1,1)*aa(ii,1)+&
    1827              : &     gmet(1,2)*amet(1,2)*aa(ii,2)+gmet(1,3)*amet(1,3)*aa(ii,3)+&
    1828              : &     (gmet(1,2)*amet(1,1)+gmet(1,1)*amet(1,2))*aa(ii,6)+&
    1829              : &     (gmet(1,3)*amet(1,1)+gmet(1,1)*amet(1,3))*aa(ii,5)+&
    1830    251536704 : &     (gmet(1,3)*amet(1,2)+gmet(1,2)*amet(1,3))*aa(ii,4))
    1831              : !    (2,2)->2
    1832              :      bb(ii,2)=3.0d0*(gmet(2,1)*amet(2,1)*aa(ii,1)+&
    1833              : &     gmet(2,2)*amet(2,2)*aa(ii,2)+gmet(2,3)*amet(2,3)*aa(ii,3)+&
    1834              : &     (gmet(2,2)*amet(2,1)+gmet(2,1)*amet(2,2))*aa(ii,6)+&
    1835              : &     (gmet(2,3)*amet(2,1)+gmet(2,1)*amet(2,3))*aa(ii,5)+&
    1836    251536704 : &     (gmet(2,3)*amet(2,2)+gmet(2,2)*amet(2,3))*aa(ii,4) )
    1837              : !    (3,3)->3
    1838              :      bb(ii,3)=3.0d0*(gmet(3,1)*amet(3,1)*aa(ii,1)+&
    1839              : &     gmet(3,2)*amet(3,2)*aa(ii,2)+gmet(3,3)*amet(3,3)*aa(ii,3)+&
    1840              : &     (gmet(3,2)*amet(3,1)+gmet(3,1)*amet(3,2))*aa(ii,6)+&
    1841              : &     (gmet(3,3)*amet(3,1)+gmet(3,1)*amet(3,3))*aa(ii,5)+&
    1842    251536704 : &     (gmet(3,3)*amet(3,2)+gmet(3,2)*amet(3,3))*aa(ii,4) )
    1843              : !    (3,2)->4
    1844              :      bb(ii,4)=3.0d0*(gmet(3,1)*amet(2,1)*aa(ii,1)+&
    1845              : &     gmet(3,2)*amet(2,2)*aa(ii,2)+gmet(3,3)*amet(2,3)*aa(ii,3)+&
    1846              : &     (gmet(3,2)*amet(2,1)+gmet(3,1)*amet(2,2))*aa(ii,6)+&
    1847              : &     (gmet(3,3)*amet(2,1)+gmet(3,1)*amet(2,3))*aa(ii,5)+&
    1848    251536704 : &     (gmet(3,3)*amet(2,2)+gmet(3,2)*amet(2,3))*aa(ii,4) )
    1849              :      bb(ii,4)=bb(ii,4)+3.0d0*(amet(3,1)*gmet(2,1)*aa(ii,1)+&
    1850              : &     amet(3,2)*gmet(2,2)*aa(ii,2)+amet(3,3)*gmet(2,3)*aa(ii,3)+&
    1851              : &     (amet(3,2)*gmet(2,1)+amet(3,1)*gmet(2,2))*aa(ii,6)+&
    1852              : &     (amet(3,3)*gmet(2,1)+amet(3,1)*gmet(2,3))*aa(ii,5)+&
    1853    251536704 : &     (amet(3,3)*gmet(2,2)+amet(3,2)*gmet(2,3))*aa(ii,4) )
    1854              : !    (3,1)->5
    1855              :      bb(ii,5)=3.0d0*(gmet(3,1)*amet(1,1)*aa(ii,1)+&
    1856              : &     gmet(3,2)*amet(1,2)*aa(ii,2)+gmet(3,3)*amet(1,3)*aa(ii,3)+&
    1857              : &     (gmet(3,2)*amet(1,1)+gmet(3,1)*amet(1,2))*aa(ii,6)+&
    1858              : &     (gmet(3,3)*amet(1,1)+gmet(3,1)*amet(1,3))*aa(ii,5)+&
    1859    251536704 : &     (gmet(3,3)*amet(1,2)+gmet(3,2)*amet(1,3))*aa(ii,4) )
    1860              :      bb(ii,5)=bb(ii,5)+3.0d0*(amet(3,1)*gmet(1,1)*aa(ii,1)+&
    1861              : &     amet(3,2)*gmet(1,2)*aa(ii,2)+amet(3,3)*gmet(1,3)*aa(ii,3)+&
    1862              : &     (amet(3,2)*gmet(1,1)+amet(3,1)*gmet(1,2))*aa(ii,6)+&
    1863              : &     (amet(3,3)*gmet(1,1)+amet(3,1)*gmet(1,3))*aa(ii,5)+&
    1864    251536704 : &     (amet(3,3)*gmet(1,2)+amet(3,2)*gmet(1,3))*aa(ii,4) )
    1865              : !    (2,1)->6
    1866              :      bb(ii,6)=3.0d0*(gmet(2,1)*amet(1,1)*aa(ii,1)+&
    1867              : &     gmet(2,2)*amet(1,2)*aa(ii,2)+gmet(2,3)*amet(1,3)*aa(ii,3)+&
    1868              : &     (gmet(2,2)*amet(1,1)+gmet(2,1)*amet(1,2))*aa(ii,6)+&
    1869              : &     (gmet(2,3)*amet(1,1)+gmet(2,1)*amet(1,3))*aa(ii,5)+&
    1870    251536704 : &     (gmet(2,3)*amet(1,2)+gmet(2,2)*amet(1,3))*aa(ii,4) )
    1871              :      bb(ii,6)=bb(ii,6)+3.0d0*(amet(2,1)*gmet(1,1)*aa(ii,1)+&
    1872              : &     amet(2,2)*gmet(1,2)*aa(ii,2)+amet(2,3)*gmet(1,3)*aa(ii,3)+&
    1873              : &     (amet(2,2)*gmet(1,1)+amet(2,1)*gmet(1,2))*aa(ii,6)+&
    1874              : &     (amet(2,3)*gmet(1,1)+amet(2,1)*gmet(1,3))*aa(ii,5)+&
    1875    251536704 : &     (amet(2,3)*gmet(1,2)+amet(2,2)*gmet(1,3))*aa(ii,4) )
    1876              : !    Include appropriate weights for multiplicity
    1877              :      bb(ii,4)=bb(ii,4)
    1878              :      bb(ii,5)=bb(ii,5)
    1879    125768352 :      bb(ii,6)=bb(ii,6)
    1880              :    end do
    1881              : 
    1882      1130816 :  else if (rank==3) then
    1883              : !  Apply rank2 expression, re and im
    1884      3392448 :    do ii=1,2
    1885              : !    Carry out g(l,m)g(j,n)*aa(l,m,n) contraction to get vector(j)
    1886      9046528 :      do jj=1,3
    1887              :        tmpiii=   gmet(1,1)*amet(jj,1)*aa(ii,1)+&
    1888              : &       gmet(2,2)*amet(jj,2)*aa(ii,7)+&
    1889      6784896 : &       gmet(3,3)*amet(jj,3)*aa(ii,10)
    1890              :        tmpijk=  (gmet(1,2)*amet(jj,3)+&
    1891              : &       gmet(3,1)*amet(jj,2)+&
    1892              : &       gmet(2,3)*amet(jj,1)+&
    1893              : &       gmet(3,2)*amet(jj,1)+&
    1894              : &       gmet(1,3)*amet(jj,2)+&
    1895      6784896 : &       gmet(2,1)*amet(jj,3)) *aa(ii,4)
    1896              :        vector(jj)=tmpiii + tmpijk +&
    1897              : &       (gmet(1,2)*amet(jj,1)+&
    1898              : &       gmet(2,1)*amet(jj,1)+&
    1899              : &       gmet(1,1)*amet(jj,2)) *aa(ii,6)+&
    1900              : &       (gmet(1,2)*amet(jj,2)+&
    1901              : &       gmet(2,1)*amet(jj,2)+&
    1902              : &       gmet(2,2)*amet(jj,1)) *aa(ii,2)+&
    1903              : &       (gmet(1,3)*amet(jj,1)+&
    1904              : &       gmet(3,1)*amet(jj,1)+&
    1905              : &       gmet(1,1)*amet(jj,3)) *aa(ii,5)+&
    1906              : &       (gmet(1,3)*amet(jj,3)+&
    1907              : &       gmet(3,1)*amet(jj,3)+&
    1908              : &       gmet(3,3)*amet(jj,1)) *aa(ii,3)+&
    1909              : &       (gmet(2,3)*amet(jj,2)+&
    1910              : &       gmet(3,2)*amet(jj,2)+&
    1911              : &       gmet(2,2)*amet(jj,3)) *aa(ii,9)+&
    1912              : &       (gmet(2,3)*amet(jj,3)+&
    1913              : &       gmet(3,2)*amet(jj,3)+&
    1914      9046528 : &       gmet(3,3)*amet(jj,2)) *aa(ii,8)
    1915              :      end do
    1916              : !    Write out components of contraction
    1917              : !    (111)->1
    1918      2261632 :      bb(ii,1) =7.5d0*con_metso(ii,1,1,1)-1.5d0*(gmet(1,1)*vector(1))
    1919              : !    (221)->2
    1920              :      bb(ii,2) =7.5d0*con_metso(ii,2,2,1)-0.5d0*(gmet(1,2)*vector(2)+&
    1921      2261632 : &     gmet(1,2)*vector(2)+gmet(2,2)*vector(1))
    1922              : !    (331)->3
    1923              :      bb(ii,3) =7.5d0*con_metso(ii,3,3,1)-0.5d0*(gmet(1,3)*vector(3)+&
    1924      2261632 : &     gmet(1,3)*vector(3)+gmet(3,3)*vector(1))
    1925              : !    (321)->4
    1926              :      bb(ii,4) =7.5d0*con_metso(ii,3,2,1)-0.5d0*(gmet(1,3)*vector(2)+&
    1927      2261632 : &     gmet(1,2)*vector(3)+gmet(3,2)*vector(1))
    1928              : !    (311)->5
    1929              :      bb(ii,5) =7.5d0*con_metso(ii,3,1,1)-0.5d0*(gmet(1,3)*vector(1)+&
    1930      2261632 : &     gmet(1,1)*vector(3)+gmet(3,1)*vector(1))
    1931              : !    (211)->6
    1932              :      bb(ii,6) =7.5d0*con_metso(ii,2,1,1)-0.5d0*(gmet(1,2)*vector(1)+&
    1933      2261632 : &     gmet(1,1)*vector(2)+gmet(2,1)*vector(1))
    1934              : !    (222)->7
    1935      2261632 :      bb(ii,7) =7.5d0*con_metso(ii,2,2,2)-1.5d0*(gmet(2,2)*vector(2))
    1936              : 
    1937              : !    (332)->8
    1938              :      bb(ii,8) =7.5d0*con_metso(ii,3,3,2)-0.5d0*(gmet(2,3)*vector(3)+&
    1939      2261632 : &     gmet(2,3)*vector(3)+gmet(3,3)*vector(2))
    1940              : !    (322)->9
    1941              :      bb(ii,9) =7.5d0*con_metso(ii,3,2,2)-0.5d0*(gmet(2,3)*vector(2)+&
    1942      2261632 : &     gmet(2,2)*vector(3)+gmet(3,2)*vector(2))
    1943              : !    (333)->10
    1944      2261632 :      bb(ii,10)=7.5d0*con_metso(ii,3,3,3)-1.5d0*(gmet(3,3)*vector(3))
    1945              : !    Include appropriate weights for multiplicity
    1946      2261632 :      bb(ii,2)=3.d0*bb(ii,2)
    1947      2261632 :      bb(ii,3)=3.d0*bb(ii,3)
    1948      2261632 :      bb(ii,4)=6.d0*bb(ii,4)
    1949      2261632 :      bb(ii,5)=3.d0*bb(ii,5)
    1950      2261632 :      bb(ii,6)=3.d0*bb(ii,6)
    1951      2261632 :      bb(ii,8)=3.d0*bb(ii,8)
    1952      3392448 :      bb(ii,9)=3.d0*bb(ii,9)
    1953              :    end do
    1954              : 
    1955              :  else
    1956              :    write(message, '(a,i0,a,a,a)' )&
    1957            0 : &   'Input rank=',rank,' not allowed.',ch10,&
    1958            0 : &   'Possible values are 0,1,2,3 only.'
    1959            0 :    ABI_BUG(message)
    1960              :  end if
    1961              : 
    1962              :  contains
    1963              : 
    1964              : !This function defines the l=3 contraction in
    1965              : !terms of the free indices of the contracted tensor (re and im)
    1966              : 
    1967     67848960 :    function cona_metso(ii,i1,i2,i3)
    1968              : 
    1969              :    real(dp) :: cona_metso
    1970              :    integer,intent(in) :: ii,i1,i2,i3
    1971              :    real(dp) :: coniii, conijk
    1972              : 
    1973              :    coniii=gmet(i1,1)*gmet(i2,1)*amet(i3,1)*aa(ii,1)+&
    1974              : &   gmet(i1,2)*gmet(i2,2)*amet(i3,2)*aa(ii,7)+&
    1975     67848960 : &   gmet(i1,3)*gmet(i2,3)*amet(i3,3)*aa(ii,10)
    1976              :    conijk=aa(ii,4)*&
    1977              : &   (gmet(i1,1)*gmet(i2,2)*amet(i3,3)+&
    1978              : &   gmet(i1,2)*gmet(i2,3)*amet(i3,1)+&
    1979              : &   gmet(i1,3)*gmet(i2,1)*amet(i3,2)+&
    1980              : &   gmet(i1,3)*gmet(i2,2)*amet(i3,1)+&
    1981              : &   gmet(i1,1)*gmet(i2,3)*amet(i3,2)+&
    1982     67848960 : &   gmet(i1,2)*gmet(i2,1)*amet(i3,3))
    1983              :    cona_metso=coniii+conijk+&
    1984              : &   (gmet(i1,1)*gmet(i2,2)*amet(i3,1)+&
    1985              : &   gmet(i1,2)*gmet(i2,1)*amet(i3,1)+&
    1986              : &   gmet(i1,1)*gmet(i2,1)*amet(i3,2))*aa(ii,6)+&
    1987              : &   (gmet(i1,1)*gmet(i2,2)*amet(i3,2)+&
    1988              : &   gmet(i1,2)*gmet(i2,1)*amet(i3,2)+&
    1989              : &   gmet(i1,2)*gmet(i2,2)*amet(i3,1))*aa(ii,2)+&
    1990              : &   (gmet(i1,1)*gmet(i2,3)*amet(i3,1)+&
    1991              : &   gmet(i1,3)*gmet(i2,1)*amet(i3,1)+&
    1992              : &   gmet(i1,1)*gmet(i2,1)*amet(i3,3))*aa(ii,5)+&
    1993              : &   (gmet(i1,1)*gmet(i2,3)*amet(i3,3)+&
    1994              : &   gmet(i1,3)*gmet(i2,1)*amet(i3,3)+&
    1995              : &   gmet(i1,3)*gmet(i2,3)*amet(i3,1))*aa(ii,3)+&
    1996              : &   (gmet(i1,2)*gmet(i2,2)*amet(i3,3)+&
    1997              : &   gmet(i1,2)*gmet(i2,3)*amet(i3,2)+&
    1998              : &   gmet(i1,3)*gmet(i2,2)*amet(i3,2))*aa(ii,9)+&
    1999              : &   (gmet(i1,2)*gmet(i2,3)*amet(i3,3)+&
    2000              : &   gmet(i1,3)*gmet(i2,2)*amet(i3,3)+&
    2001     67848960 : &   gmet(i1,3)*gmet(i2,3)*amet(i3,2))*aa(ii,8)
    2002     67848960 :  end function cona_metso
    2003              : 
    2004              : 
    2005     22616320 :    function con_metso(ii,i1,i2,i3)
    2006              : 
    2007              :    real(dp) :: con_metso
    2008              :    integer,intent(in) :: ii,i1,i2,i3
    2009              : 
    2010     22616320 :    con_metso=(cona_metso(ii,i3,i1,i2)+cona_metso(ii,i2,i3,i1)+cona_metso(ii,i1,i2,i3))/3.d0
    2011              : 
    2012     22616320 :  end function con_metso
    2013              : 
    2014              : end subroutine metcon_so
    2015              : !!***
    2016              : 
    2017              : !!****f* m_contract/metric_so
    2018              : !! NAME
    2019              : !! metric_so
    2020              : !!
    2021              : !! FUNCTION
    2022              : !! Computes Pauli matrices and antisymmetric tensor needed for
    2023              : !! spin-orbit.
    2024              : !!
    2025              : !! INPUTS
    2026              : !!  gprimd(3,3)=dimensional primitive translations for reciprocal space
    2027              : !!              (bohr**-1)
    2028              : !!  soc_weight(3)=prefactors for the spin-orbit components (dimensionless):
    2029              : !!                (soc_weight(1),soc_weight(2),soc_weight(3))
    2030              : !!                scale the \sigma_x, \sigma_y, \sigma_z contributions, respectively.
    2031              : !!  alpha=Euler angle for rotation around z-axis
    2032              : !!  beta =Euler angle for rotation around y-axis
    2033              : !!
    2034              : !! OUTPUT
    2035              : !!  amet(2,3,3,2,2)=the antisymmetric tensor A(Re/Im,y,y'',s,s'')
    2036              : !!  pauli(2,2,2,3)=Pauli matrixes
    2037              : !!
    2038              : !! NOTES
    2039              : !! (the preprocessing based on CPP does not allow isolated quotes,
    2040              : !!  so that they have been doubled in the following latex equations)
    2041              : !!{{\ \begin{eqnarray}
    2042              : !! $2 Pauli(s,s'',1) & = & 0 & 1 \nonumber
    2043              : !!                   &   & 1 & 0 \nonumber
    2044              : !!  2 Pauli(s,s'',2) & = & 0 & -i \nonumber
    2045              : !!                   &   & i &  0 \nonumber
    2046              : !!  2 Pauli(s,s'',3) & = & 1 &  0 \nonumber
    2047              : !!                   &   & 0 & -1
    2048              : !! \end{eqnarray} }}
    2049              : !!{{\ \begin{eqnarray}
    2050              : !!    $Amet(y,y'',s,s'') & = & -i Pauli(s,s'',n) E(n,m,m'') Gprimd(m,y) Gprimd(m'',y'')
    2051              : !! \end{eqnarray} }}
    2052              : !!
    2053              : !! E(n,m,m''):   full antisymetric tensor
    2054              : !! s,s'':        spin indices (1..2)
    2055              : !! y,y'',m,m'',n: metric indices (1..3)
    2056              : !! a,b:         strain indices (1..3)
    2057              : !! Amet and Pauli are complex
    2058              : !!
    2059              : !! SOURCE
    2060              : 
    2061      2339994 : subroutine metric_so(amet,soc_weight,gprimd,pauli,alpha,beta)
    2062              : 
    2063              : !Arguments ------------------------------------
    2064              : !scalars
    2065              :  real(dp),intent(in) :: alpha, beta
    2066              : !arrays
    2067              :  real(dp),intent(in) :: gprimd(3,3),soc_weight(3)
    2068              :  real(dp),intent(out) :: amet(2,3,3,2,2),pauli(2,2,2,3)
    2069              : 
    2070              : !Local variables-------------------------------
    2071              : !scalars
    2072              :  integer :: iy1,iy2,m1,m2,n
    2073              : !arrays
    2074              :  real(dp) :: buffer1(3,3,2,2), cb2, sb2 !,buffer2(3,3,3,3,2,2)
    2075              :  complex(dp) :: S(2,2,3), Srot(2,2), U(2,2), ep, em
    2076              : ! **********************************************************************
    2077              : 
    2078              : !Fill in Pauli matrices and make them spin matrices:
    2079              : !Pauli(Re/Im,up,down,coord):
    2080      2339994 :  pauli(:,:,:,:)=0.d0
    2081      2339994 :  pauli(1,1,2,1)= 1.d0;pauli(1,2,1,1)= 1.d0
    2082      2339994 :  pauli(2,1,2,2)=-1.d0;pauli(2,2,1,2)= 1.d0
    2083      2339994 :  pauli(1,1,1,3)= 1.d0;pauli(1,2,2,3)=-1.d0
    2084    107639724 :  pauli(:,:,:,:)= 0.5d0*pauli(:,:,:,:)
    2085              : 
    2086      2339994 :  if (.not.(abs(alpha) < tol8 .and. abs(beta) < tol8)) then
    2087       280258 :    S(:,:,:) = cmplx(pauli(1,:,:,:), pauli(2,:,:,:), kind=dp)
    2088              : 
    2089        12739 :    cb2 = cos(half*beta); sb2 = sin(half*beta)
    2090        12739 :    em = exp(-j_dpc*half*alpha); ep = conjg(em)
    2091              : 
    2092        12739 :    U(1,1) =  cb2 * em; U(1,2) = -sb2 * em
    2093        12739 :    U(2,1) =  sb2 * ep; U(2,2) =  cb2 * ep
    2094              : 
    2095        50956 :    do n = 1, 3
    2096      1108293 :      Srot(:,:) = matmul(conjg(transpose(U)), matmul(S(:,:,n), U))
    2097       280258 :      S(:,:,n)  = Srot(:,:)
    2098              :    end do
    2099              :     
    2100        12739 :    pauli(:,:,:,:) = zero
    2101       280258 :    pauli(1,:,:,:) = real(S(:,:,:), kind=dp)
    2102      2607513 :    pauli(2,:,:,:) = aimag(S(:,:,:))
    2103              :  end if
    2104              : 
    2105              : !Construct the antisymmetric tensor:
    2106      2339994 :  amet(:,:,:,:,:)=0.d0
    2107      9359976 :  do iy2=1,3
    2108     30419922 :    do iy1=1,3
    2109     91259766 :      do n=1,3
    2110     63179838 :        m1=mod(n ,3)+1    !  n,m1,m2 is an even permutation
    2111     63179838 :        m2=mod(m1,3)+1
    2112              :        amet(1:2,iy1,iy2,1:2,1:2) = amet(:,iy1,iy2,:,:) &
    2113              : &       + soc_weight(n)*pauli(:,:,:,n) &
    2114              : &       *(gprimd(m1,iy1)*gprimd(m2,iy2) &
    2115    968757516 : &       -gprimd(m2,iy1)*gprimd(m1,iy2))
    2116              :      end do
    2117              :    end do
    2118              :  end do
    2119              : !amet= -i amet
    2120    128699670 :  buffer1(:,:,:,:)=-amet(1,:,:,:,:)
    2121    128699670 :  amet(1,:,:,:,:) = amet(2,:,:,:,:)
    2122    128699670 :  amet(2,:,:,:,:) =buffer1(:,:,:,:)
    2123              : 
    2124              : !DEBUG
    2125              : !!Eventually construct the gradients of Amet wrt strains:
    2126              : !! DAmet(y,y'',a,b,s,s'')= d[Amet(y,y'',s,s'')]/d[strain(a,b)]
    2127              : !!                        -i Pauli(s,s'',n)*
    2128              : !!                          ( E(n,a,m'')*Gprimd(b,y )*Gprimd(m'',y'')
    2129              : !!                           +E(n,m,a )*Gprimd(b,y'')*Gprimd(m ,y ) )
    2130              : !damet(:,:,:,:,:,:,:)=0.d0
    2131              : !do ib=1,3
    2132              : !do ia=1,3
    2133              : !m1=mod(ia,3)+1    !  ia,m1,m2 is an even permutation
    2134              : !m2=mod(m1,3)+1
    2135              : !do iy2=1,3
    2136              : !do iy1=1,3
    2137              : !damet(:,iy1,iy2,ia,ib,:,:) = damet(:,iy1,iy2,ia,ib,:,:) &
    2138              : !&        + (pauli(:,:,:,m2)*gprimd(m1,iy2) &
    2139              : !-pauli(:,:,:,m1)*gprimd(m2,iy2))*gprimd(ib,iy1) &
    2140              : !&        + (pauli(:,:,:,m1)*gprimd(m2,iy1) &
    2141              : !-pauli(:,:,:,m2)*gprimd(m1,iy1))*gprimd(ib,iy2)
    2142              : !end do
    2143              : !end do
    2144              : !end do
    2145              : !end do
    2146              : !! damet= i damet
    2147              : !buffer2(:,:,:,:,:,:)= damet(1,:,:,:,:,:,:)
    2148              : !damet(1,:,:,:,:,:,:)= -damet(2,:,:,:,:,:,:)
    2149              : !damet(2,:,:,:,:,:,:)=buffer2(:,:,:,:,:,:)
    2150              : !! Symetrize damet(:,:,:,a,b,:,:)
    2151              : !damet(:,:,:,1,2,:,:)=0.5d0*(damet(:,:,:,1,2,:,:)+damet(:,:,:,2,1,:,:))
    2152              : !damet(:,:,:,1,3,:,:)=0.5d0*(damet(:,:,:,1,3,:,:)+damet(:,:,:,3,1,:,:))
    2153              : !damet(:,:,:,2,3,:,:)=0.5d0*(damet(:,:,:,2,3,:,:)+damet(:,:,:,3,2,:,:))
    2154              : !damet(:,:,:,2,1,:,:)=damet(:,:,:,1,2,:,:)
    2155              : !damet(:,:,:,3,1,:,:)=damet(:,:,:,1,3,:,:)
    2156              : !damet(:,:,:,3,2,:,:)=damet(:,:,:,2,3,:,:)
    2157              : !ENDDEBUG
    2158              : 
    2159      2339994 : end subroutine metric_so
    2160              : !!***
    2161              : 
    2162              : end module m_contract
    2163              : !!***
        

Generated by: LCOV version 2.3-1