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-11-10 11:05:29 Functions: 100.0 % 15 15
Branches: 98.0 % 204 200

             Branch data     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                 :      872029 : 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                 :      872029 : & (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                 :      872029 : & (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                 :      872029 : & (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                 :      872029 : & (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                 :      872029 : & (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                 :      872029 : & (rank1(re,3)*rank3(re,4)+rank1(im,3)*rank3(im,4)))
     126                 :             : 
     127                 :      872029 : 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                 :      493901 : 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                 :      493901 : & 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                 :      493901 : & 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                 :      493901 : & 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                 :      493901 : & 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                 :      493901 : & 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                 :      493901 : & gmet(1,2)*(gxa(re,6)*gxa(re,6)+gxa(im,6)*gxa(im,6)))
     234                 :             : 
     235                 :      493901 : 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                 :      636849 : 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                 :      636849 : & 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                 :      636849 : & 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                 :      636849 : & 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                 :      636849 : & 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                 :      636849 : & 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                 :      636849 : & gxa(re,6)*rank4(re, 2)+gxa(im,6)*rank4(im, 2))
     590                 :             : 
     591                 :      636849 : 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                 :   293469401 : 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         [ +  + ]:   293469401 :  if (rank==0) then
    1537                 :             : !  Simply copy scalar, re and im
    1538                 :   115515745 :    bb(1,1)=aa(1,1)
    1539                 :   115515745 :    bb(2,1)=aa(2,1)
    1540                 :             : 
    1541         [ +  + ]:   177953656 :  else if (rank==1) then
    1542                 :             : !  Apply gmet to input vector, re and im
    1543         [ +  + ]:   327047547 :    do ii=1,2
    1544         [ +  + ]:   981142641 :      do jj=1,3
    1545                 :   872126792 :        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         [ +  + ]:    68937807 :  else if (rank==2) then
    1551                 :             : !  Apply rank2 expression, re and im
    1552         [ +  + ]:   204490266 :    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                 :   136326844 : &     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                 :   136326844 : &     - 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                 :   136326844 : &     - 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                 :   136326844 : &     - 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                 :   136326844 : &     - 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                 :   136326844 : &     - 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                 :   136326844 : &     - gmet(2,1)*scalar)
    1600                 :             : !    Include appropriate weights for multiplicity
    1601                 :   136326844 :      bb(ii,4)=2.d0*bb(ii,4)
    1602                 :   136326844 :      bb(ii,5)=2.d0*bb(ii,5)
    1603                 :   204490266 :      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                 :   277228900 : 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         [ -  + ]:   277228900 :  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         [ +  + ]:   277228900 :  else if (rank==1) then
    1814                 :             : !  Apply gmet to input vector, re and im
    1815         [ +  + ]:   450186864 :    do ii=1,2
    1816         [ +  + ]:  1350560592 :      do jj=1,3
    1817                 :  1200498304 :        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         [ +  + ]:   127166612 :  else if (rank==2) then
    1822                 :             : !  Apply rank2 expression, re and im
    1823         [ +  + ]:   378107388 :    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                 :   252071592 : &     (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                 :   252071592 : &     (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                 :   252071592 : &     (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                 :   252071592 : &     (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                 :   252071592 : &     (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                 :   252071592 : &     (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                 :   252071592 : &     (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                 :   252071592 : &     (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                 :   252071592 : &     (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                 :   126035796 :      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                 :     2424708 : 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                 :     2424708 :  pauli(:,:,:,:)=0.d0
    2081                 :     2424708 :  pauli(1,1,2,1)= 1.d0;pauli(1,2,1,1)= 1.d0
    2082                 :     2424708 :  pauli(2,1,2,2)=-1.d0;pauli(2,2,1,2)= 1.d0
    2083                 :     2424708 :  pauli(1,1,1,3)= 1.d0;pauli(1,2,2,3)=-1.d0
    2084   [ +  +  +  +  :   111536568 :  pauli(:,:,:,:)= 0.5d0*pauli(:,:,:,:)
             +  +  +  + ]
    2085                 :             : 
    2086   [ +  -  +  + ]:     2424708 :  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   [ +  +  +  +  :     2692227 :    pauli(2,:,:,:) = aimag(S(:,:,:))
                   +  + ]
    2103                 :             :  end if
    2104                 :             : 
    2105                 :             : !Construct the antisymmetric tensor:
    2106                 :     2424708 :  amet(:,:,:,:,:)=0.d0
    2107         [ +  + ]:     9698832 :  do iy2=1,3
    2108         [ +  + ]:    31521204 :    do iy1=1,3
    2109         [ +  + ]:    94563612 :      do n=1,3
    2110                 :    65467116 :        m1=mod(n ,3)+1    !  n,m1,m2 is an even permutation
    2111                 :    65467116 :        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   [ +  +  +  +  :  1003829112 : &       -gprimd(m2,iy1)*gprimd(m1,iy2))
                   +  + ]
    2116                 :             :      end do
    2117                 :             :    end do
    2118                 :             :  end do
    2119                 :             : !amet= -i amet
    2120   [ +  +  +  +  :   133358940 :  buffer1(:,:,:,:)=-amet(1,:,:,:,:)
             +  +  +  + ]
    2121   [ +  +  +  +  :   133358940 :  amet(1,:,:,:,:) = amet(2,:,:,:,:)
             +  +  +  + ]
    2122   [ +  +  +  +  :   133358940 :  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                 :     2424708 : end subroutine metric_so
    2160                 :             : !!***
    2161                 :             : 
    2162                 :             : end module m_contract
    2163                 :             : !!***
        

Generated by: LCOV version 2.3-1