TABLE OF CONTENTS


ABINIT/strsocv [ Functions ]

[ Top ] [ Functions ]

NAME

 strsocv

FUNCTION

 Convert from antisymmetric storage mode 3x3x3 rank3 tensor in reduced
 coordinates "red" to symmetric storage mode 3x3 rank2 tensor in
 cartesian coordinates "cart", using metric tensor "gprimd".

COPYRIGHT

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

INPUTS

  red(6,3)=3x3x3 tensor in antisymmetric storage mode,
           reduced coordinates
  gprimd(3,3)=reciprocal space dimensional primitive translations

OUTPUT

  cart(6)=3x3 tensor in symmetric storage mode,
          cartesian coordinates

NOTES

 This routine is used to compute spin-orbit stress tensor.

 red is antisymmetric in first two indices and stored
     as 11 22 33 32 31 21.
 cart is symmetric and stored as 11 22 33 32 31 21.

 cart(1,1) & = &        & red(i,j,2) G(3,i) G(1,j) + red(i,j,3) G(1,i) G(2,j) \nonumber
 cart(2,2) & = &        & red(i,j,1) G(2,i) G(3,j) + red(i,j,3) G(1,i) G(2,j) \nonumber
 cart(3,3) & = &        & red(i,j,1) G(2,i) G(3,j) + red(i,j,2) G(3,i) G(1,j) \nonumber
 cart(3,2) & = &  0.5 ( & red(i,j,3) G(1,i) G(3,j) + red(i,j,2) G(2,i) G(1,j)) \nonumber
 cart(3,1) & = &  0.5 ( & red(i,j,3) G(3,i) G(2,j) + red(i,j,1) G(2,i) G(1,j)) \nonumber
 cart(2,1) & = &  0.5 ( & red(i,j,2) G(3,i) G(2,j) + red(i,j,1) G(1,i) G(3,j))
 \end{eqnarray} }}

PARENTS

      nonlop_pl

CHILDREN

SOURCE

 50 #if defined HAVE_CONFIG_H
 51 #include "config.h"
 52 #endif
 53 
 54 #include "abi_common.h"
 55 
 56 
 57 subroutine strsocv(red,gprimd,cart)
 58 
 59  use defs_basis
 60  use m_profiling_abi
 61 
 62 !This section has been created automatically by the script Abilint (TD).
 63 !Do not modify the following lines by hand.
 64 #undef ABI_FUNC
 65 #define ABI_FUNC 'strsocv'
 66 !End of the abilint section
 67 
 68  implicit none
 69 
 70 !Arguments ------------------------------------
 71 !arrays
 72  real(dp),intent(in) :: gprimd(3,3),red(6,3)
 73  real(dp),intent(out) :: cart(6)
 74 
 75 !Local variables-------------------------------
 76 !scalars
 77  integer :: ii,jj
 78 !arrays
 79  real(dp) :: work(3,3,3)
 80 
 81 ! *************************************************************************
 82 
 83  do ii=1,3
 84    work(1,1,ii)=0.d0
 85    work(2,2,ii)=0.d0
 86    work(3,3,ii)=0.d0
 87    work(3,2,ii)=red(4,ii) ; work(2,3,ii)=-red(4,ii)
 88    work(3,1,ii)=red(5,ii) ; work(1,3,ii)=-red(5,ii)
 89    work(2,1,ii)=red(6,ii) ; work(1,2,ii)=-red(6,ii)
 90  end do
 91 
 92  cart(:)=0.d0
 93  do jj=1,3
 94    do ii=1,3
 95      cart(1)=cart(1)+work(ii,jj,2)*gprimd(3,ii)*gprimd(1,jj)&
 96 &     +work(ii,jj,3)*gprimd(1,ii)*gprimd(2,jj)
 97      cart(2)=cart(2)+work(ii,jj,1)*gprimd(2,ii)*gprimd(3,jj)&
 98 &     +work(ii,jj,3)*gprimd(1,ii)*gprimd(2,jj)
 99      cart(3)=cart(3)+work(ii,jj,1)*gprimd(2,ii)*gprimd(3,jj)&
100 &     +work(ii,jj,2)*gprimd(3,ii)*gprimd(1,jj)
101      cart(4)=cart(4)+work(ii,jj,3)*gprimd(1,ii)*gprimd(3,jj)&
102 &     +work(ii,jj,2)*gprimd(2,ii)*gprimd(1,jj)
103      cart(5)=cart(5)+work(ii,jj,3)*gprimd(3,ii)*gprimd(2,jj)&
104 &     +work(ii,jj,1)*gprimd(2,ii)*gprimd(1,jj)
105      cart(6)=cart(6)+work(ii,jj,2)*gprimd(3,ii)*gprimd(2,jj)&
106 &     +work(ii,jj,1)*gprimd(1,ii)*gprimd(3,jj)
107    end do
108  end do
109  cart(4)=0.5d0*cart(4)
110  cart(5)=0.5d0*cart(5)
111  cart(6)=0.5d0*cart(6)
112 
113 end subroutine strsocv