TABLE OF CONTENTS
ABINIT/strsocv [ 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