TABLE OF CONTENTS


ABINIT/metcon [ Functions ]

[ Top ] [ Functions ]

NAME

 metcon

FUNCTION

 Carries out specialized metric tensor contractions needed for
 l=0,1,2,3 nonlocal Kleinman-Bylander pseudopotential operation.
 Full advantage is taken of the full permutational symmetry of these
 tensors.

COPYRIGHT

 Copyright (C) 1998-2018 ABINIT group (DCA, XG, GMR)
 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

  rank=0,1,2, or 3 = rank of input tensor aa
  gmet(3,3)=metric tensor (array is symmetric but stored as 3x3)
  aa(2,(rank+1)*(rank+2)/2)=unique elements of complex input tensor

OUTPUT

  bb(2,(rank+1)*(rank+2)/2)=unique elements of complex output tensor

NOTES

 All tensors are stored in a compressed storage mode defined below;
 input and output conform to this scheme.
 When tensor elements occur repeatedly due to symmetry, the
 WEIGHT IS INCLUDED in the output tensor element to simplify later
 contractions with other tensors of the same rank and form, i.e. the
 next contraction is then simply a dot product over the unique elements.

 Definitions of the contractions:

 rank=0:  bb = aa  (simply copy the scalar value, no use of gmet)

 rank=1:  bb(i)= $gmet(i,l) aa(l)$  (3 elements in, 3 elements out)

 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)$
          (6 elements in, 6 elements out)

 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)$
          (10 elements in, 10 elements out)
         In this rank 3 case, the second term is NOT symmetric in all
         permutations of i,j,k, but the final tensor b(ijk) may be
         symmetrized over all permutations because it will be
         contracted with a completely symmetric tensor.

 The compressed storage scheme is based on storing a symmetric 3x3 matrix as
     (1 . .)
     (6 2 .)
     (5 4 3)
 which leads to the following mappings for all ranks
 where the compressed storage index is to the right of the arrow:
 rank=0 1->1 (only a scalar)
 rank=1 1->1 2->2 3->3 (standard vector, no compression)
 rank=2 11->1 22->2 33->3 32->4 31->5 21->6
  weights   1     1     1     2     2     2
 rank=3 111->1 221->2 331->3 321->4 311->5 211->6 222->7 332->8 322->9 333->10
  weights    1      3      3      6      3      3      1      3      3       1

PARENTS

      nonlop_pl

CHILDREN

SOURCE

 71 #if defined HAVE_CONFIG_H
 72 #include "config.h"
 73 #endif
 74 
 75 #include "abi_common.h"
 76 
 77 
 78 subroutine metcon(rank,gmet,aa,bb)
 79 
 80  use defs_basis
 81  use m_errors
 82 
 83 !This section has been created automatically by the script Abilint (TD).
 84 !Do not modify the following lines by hand.
 85 #undef ABI_FUNC
 86 #define ABI_FUNC 'metcon'
 87 !End of the abilint section
 88 
 89  implicit none
 90 
 91 !Arguments ------------------------------------
 92 !scalars
 93  integer,intent(in) :: rank
 94 !arrays
 95  real(dp),intent(in) :: aa(2,((rank+1)*(rank+2))/2),gmet(3,3)
 96  real(dp),intent(out) :: bb(2,((rank+1)*(rank+2))/2)
 97 
 98 !Local variables-------------------------------
 99 !scalars
100  integer :: ii,jj
101  real(dp) :: scalar,tmpiii,tmpijk
102  character(len=500) :: message
103 !arrays
104  real(dp) :: vector(3)
105 
106 ! *************************************************************************
107 
108 !This statement function defines the l=3 contraction in
109 !terms of the free indices of the contracted tensor (re and im)
110 ! coniii(ii,i1,i2,i3)=gmet(i1,1)*gmet(i2,1)*gmet(i3,1)*aa(ii,1)+&
111 !& gmet(i1,2)*gmet(i2,2)*gmet(i3,2)*aa(ii,7)+&
112 !& gmet(i1,3)*gmet(i2,3)*gmet(i3,3)*aa(ii,10)
113 ! conijk(ii,i1,i2,i3)=aa(ii,4)*&
114 !& (gmet(i1,1)*gmet(i2,2)*gmet(i3,3)+&
115 !& gmet(i1,2)*gmet(i2,3)*gmet(i3,1)+&
116 !& gmet(i1,3)*gmet(i2,1)*gmet(i3,2)+&
117 !& gmet(i1,3)*gmet(i2,2)*gmet(i3,1)+&
118 !& gmet(i1,1)*gmet(i2,3)*gmet(i3,2)+&
119 !& gmet(i1,2)*gmet(i2,1)*gmet(i3,3))
120 ! con(ii,i1,i2,i3)=coniii(ii,i1,i2,i3)+conijk(ii,i1,i2,i3)+&
121 !& (gmet(i1,1)*gmet(i2,2)*gmet(i3,1)+&
122 !& gmet(i1,2)*gmet(i2,1)*gmet(i3,1)+&
123 !& gmet(i1,1)*gmet(i2,1)*gmet(i3,2))*aa(ii,6)+&
124 !& (gmet(i1,1)*gmet(i2,2)*gmet(i3,2)+&
125 !& gmet(i1,2)*gmet(i2,1)*gmet(i3,2)+&
126 !& gmet(i1,2)*gmet(i2,2)*gmet(i3,1))*aa(ii,2)+&
127 !& (gmet(i1,1)*gmet(i2,3)*gmet(i3,1)+&
128 !& gmet(i1,3)*gmet(i2,1)*gmet(i3,1)+&
129 !& gmet(i1,1)*gmet(i2,1)*gmet(i3,3))*aa(ii,5)+&
130 !& (gmet(i1,1)*gmet(i2,3)*gmet(i3,3)+&
131 !& gmet(i1,3)*gmet(i2,1)*gmet(i3,3)+&
132 !& gmet(i1,3)*gmet(i2,3)*gmet(i3,1))*aa(ii,3)+&
133 !& (gmet(i1,2)*gmet(i2,2)*gmet(i3,3)+&
134 !& gmet(i1,2)*gmet(i2,3)*gmet(i3,2)+&
135 !& gmet(i1,3)*gmet(i2,2)*gmet(i3,2))*aa(ii,9)+&
136 !& (gmet(i1,2)*gmet(i2,3)*gmet(i3,3)+&
137 !& gmet(i1,3)*gmet(i2,2)*gmet(i3,3)+&
138 !& gmet(i1,3)*gmet(i2,3)*gmet(i3,2))*aa(ii,8)
139 
140 !DEBUG
141 !write(std_out,*)' metcon : enter '
142 !stop
143 !ENDDEBUG
144  if (rank==0) then
145 !  Simply copy scalar, re and im
146    bb(1,1)=aa(1,1)
147    bb(2,1)=aa(2,1)
148 
149  else if (rank==1) then
150 !  Apply gmet to input vector, re and im
151    do ii=1,2
152      do jj=1,3
153        bb(ii,jj)=gmet(jj,1)*aa(ii,1)+gmet(jj,2)*aa(ii,2)+gmet(jj,3)*aa(ii,3)
154      end do
155    end do
156 
157 
158  else if (rank==2) then
159 !  Apply rank2 expression, re and im
160    do ii=1,2
161 !    Carry out g(c,d)*aa(c,d) contraction to get scalar
162      scalar=gmet(1,1)*aa(ii,1)+gmet(2,2)*aa(ii,2)+&
163 &     gmet(3,3)*aa(ii,3)+2.0d0*(gmet(2,1)*aa(ii,6)+&
164 &     gmet(3,1)*aa(ii,5)+gmet(3,2)*aa(ii,4) )
165 !    Write out components of contraction
166 !    (1,1)->1
167      bb(ii,1)=0.5d0*(3.0d0*(gmet(1,1)*gmet(1,1)*aa(ii,1)+&
168 &     gmet(1,2)*gmet(1,2)*aa(ii,2)+gmet(1,3)*gmet(1,3)*aa(ii,3)+&
169 &     (gmet(1,2)*gmet(1,1)+gmet(1,1)*gmet(1,2))*aa(ii,6)+&
170 &     (gmet(1,3)*gmet(1,1)+gmet(1,1)*gmet(1,3))*aa(ii,5)+&
171 &     (gmet(1,3)*gmet(1,2)+gmet(1,2)*gmet(1,3))*aa(ii,4) ) &
172 &     - gmet(1,1)*scalar)
173 !    (2,2)->2
174      bb(ii,2)=0.5d0*(3.0d0*(gmet(2,1)*gmet(2,1)*aa(ii,1)+&
175 &     gmet(2,2)*gmet(2,2)*aa(ii,2)+gmet(2,3)*gmet(2,3)*aa(ii,3)+&
176 &     (gmet(2,2)*gmet(2,1)+gmet(2,1)*gmet(2,2))*aa(ii,6)+&
177 &     (gmet(2,3)*gmet(2,1)+gmet(2,1)*gmet(2,3))*aa(ii,5)+&
178 &     (gmet(2,3)*gmet(2,2)+gmet(2,2)*gmet(2,3))*aa(ii,4) )&
179 &     - gmet(2,2)*scalar)
180 !    (3,3)->3
181      bb(ii,3)=0.5d0*(3.0d0*(gmet(3,1)*gmet(3,1)*aa(ii,1)+&
182 &     gmet(3,2)*gmet(3,2)*aa(ii,2)+gmet(3,3)*gmet(3,3)*aa(ii,3)+&
183 &     (gmet(3,2)*gmet(3,1)+gmet(3,1)*gmet(3,2))*aa(ii,6)+&
184 &     (gmet(3,3)*gmet(3,1)+gmet(3,1)*gmet(3,3))*aa(ii,5)+&
185 &     (gmet(3,3)*gmet(3,2)+gmet(3,2)*gmet(3,3))*aa(ii,4) )&
186 &     - gmet(3,3)*scalar)
187 !    (3,2)->4
188      bb(ii,4)=0.5d0*(3.0d0*(gmet(3,1)*gmet(2,1)*aa(ii,1)+&
189 &     gmet(3,2)*gmet(2,2)*aa(ii,2)+gmet(3,3)*gmet(2,3)*aa(ii,3)+&
190 &     (gmet(3,2)*gmet(2,1)+gmet(3,1)*gmet(2,2))*aa(ii,6)+&
191 &     (gmet(3,3)*gmet(2,1)+gmet(3,1)*gmet(2,3))*aa(ii,5)+&
192 &     (gmet(3,3)*gmet(2,2)+gmet(3,2)*gmet(2,3))*aa(ii,4) )&
193 &     - gmet(3,2)*scalar)
194 !    (3,1)->5
195      bb(ii,5)=0.5d0*(3.0d0*(gmet(3,1)*gmet(1,1)*aa(ii,1)+&
196 &     gmet(3,2)*gmet(1,2)*aa(ii,2)+gmet(3,3)*gmet(1,3)*aa(ii,3)+&
197 &     (gmet(3,2)*gmet(1,1)+gmet(3,1)*gmet(1,2))*aa(ii,6)+&
198 &     (gmet(3,3)*gmet(1,1)+gmet(3,1)*gmet(1,3))*aa(ii,5)+&
199 &     (gmet(3,3)*gmet(1,2)+gmet(3,2)*gmet(1,3))*aa(ii,4) )&
200 &     - gmet(3,1)*scalar)
201 !    (2,1)->6
202      bb(ii,6)=0.5d0*(3.0d0*(gmet(2,1)*gmet(1,1)*aa(ii,1)+&
203 &     gmet(2,2)*gmet(1,2)*aa(ii,2)+gmet(2,3)*gmet(1,3)*aa(ii,3)+&
204 &     (gmet(2,2)*gmet(1,1)+gmet(2,1)*gmet(1,2))*aa(ii,6)+&
205 &     (gmet(2,3)*gmet(1,1)+gmet(2,1)*gmet(1,3))*aa(ii,5)+&
206 &     (gmet(2,3)*gmet(1,2)+gmet(2,2)*gmet(1,3))*aa(ii,4) ) &
207 &     - gmet(2,1)*scalar)
208 !    Include appropriate weights for multiplicity
209      bb(ii,4)=2.d0*bb(ii,4)
210      bb(ii,5)=2.d0*bb(ii,5)
211      bb(ii,6)=2.d0*bb(ii,6)
212    end do
213 
214  else if (rank==3) then
215 !  Apply rank2 expression, re and im
216    do ii=1,2
217 !    Carry out g(l,m)g(j,n)*aa(l,m,n) contraction to get vector(j)
218      do jj=1,3
219        tmpiii=   gmet(1,1)*gmet(jj,1)*aa(ii,1)+&
220 &       gmet(2,2)*gmet(jj,2)*aa(ii,7)+&
221 &       gmet(3,3)*gmet(jj,3)*aa(ii,10)
222        tmpijk=  (gmet(1,2)*gmet(jj,3)+&
223 &       gmet(3,1)*gmet(jj,2)+&
224 &       gmet(2,3)*gmet(jj,1)+&
225 &       gmet(3,2)*gmet(jj,1)+&
226 &       gmet(1,3)*gmet(jj,2)+&
227 &       gmet(2,1)*gmet(jj,3)) *aa(ii,4)
228        vector(jj)=tmpiii + tmpijk +&
229 &       (gmet(1,2)*gmet(jj,1)+&
230 &       gmet(2,1)*gmet(jj,1)+&
231 &       gmet(1,1)*gmet(jj,2)) *aa(ii,6)+&
232 &       (gmet(1,2)*gmet(jj,2)+&
233 &       gmet(2,1)*gmet(jj,2)+&
234 &       gmet(2,2)*gmet(jj,1)) *aa(ii,2)+&
235 &       (gmet(1,3)*gmet(jj,1)+&
236 &       gmet(3,1)*gmet(jj,1)+&
237 &       gmet(1,1)*gmet(jj,3)) *aa(ii,5)+&
238 &       (gmet(1,3)*gmet(jj,3)+&
239 &       gmet(3,1)*gmet(jj,3)+&
240 &       gmet(3,3)*gmet(jj,1)) *aa(ii,3)+&
241 &       (gmet(2,3)*gmet(jj,2)+&
242 &       gmet(3,2)*gmet(jj,2)+&
243 &       gmet(2,2)*gmet(jj,3)) *aa(ii,9)+&
244 &       (gmet(2,3)*gmet(jj,3)+&
245 &       gmet(3,2)*gmet(jj,3)+&
246 &       gmet(3,3)*gmet(jj,2)) *aa(ii,8)
247      end do
248 !    Write out components of contraction
249 !    (111)->1
250      bb(ii,1) =2.5d0*con_met(ii,1,1,1)-1.5d0*(gmet(1,1)*vector(1))
251 !    (221)->2
252      bb(ii,2) =2.5d0*con_met(ii,2,2,1)-0.5d0*(gmet(1,2)*vector(2)+&
253 &     gmet(1,2)*vector(2)+gmet(2,2)*vector(1))
254 !    (331)->3
255      bb(ii,3) =2.5d0*con_met(ii,3,3,1)-0.5d0*(gmet(1,3)*vector(3)+&
256 &     gmet(1,3)*vector(3)+gmet(3,3)*vector(1))
257 !    (321)->4
258      bb(ii,4) =2.5d0*con_met(ii,3,2,1)-0.5d0*(gmet(1,3)*vector(2)+&
259 &     gmet(1,2)*vector(3)+gmet(3,2)*vector(1))
260 !    (311)->5
261      bb(ii,5) =2.5d0*con_met(ii,3,1,1)-0.5d0*(gmet(1,3)*vector(1)+&
262 &     gmet(1,1)*vector(3)+gmet(3,1)*vector(1))
263 !    (211)->6
264      bb(ii,6) =2.5d0*con_met(ii,2,1,1)-0.5d0*(gmet(1,2)*vector(1)+&
265 &     gmet(1,1)*vector(2)+gmet(2,1)*vector(1))
266 !    (222)->7
267      bb(ii,7) =2.5d0*con_met(ii,2,2,2)-1.5d0*(gmet(2,2)*vector(2))
268 
269 !    (332)->8
270      bb(ii,8) =2.5d0*con_met(ii,3,3,2)-0.5d0*(gmet(2,3)*vector(3)+&
271 &     gmet(2,3)*vector(3)+gmet(3,3)*vector(2))
272 !    (322)->9
273      bb(ii,9) =2.5d0*con_met(ii,3,2,2)-0.5d0*(gmet(2,3)*vector(2)+&
274 &     gmet(2,2)*vector(3)+gmet(3,2)*vector(2))
275 !    (333)->10
276      bb(ii,10)=2.5d0*con_met(ii,3,3,3)-1.5d0*(gmet(3,3)*vector(3))
277 !    Include appropriate weights for multiplicity
278      bb(ii,2)=3.d0*bb(ii,2)
279      bb(ii,3)=3.d0*bb(ii,3)
280      bb(ii,4)=6.d0*bb(ii,4)
281      bb(ii,5)=3.d0*bb(ii,5)
282      bb(ii,6)=3.d0*bb(ii,6)
283      bb(ii,8)=3.d0*bb(ii,8)
284      bb(ii,9)=3.d0*bb(ii,9)
285    end do
286 
287  else
288    write(message, '(a,i0,a,a,a)' )&
289 &   'Input rank=',rank,' not allowed.',ch10,&
290 &   'Possible values are 0,1,2,3 only.'
291    MSG_BUG(message)
292  end if
293 
294  contains
295 
296    function con_met(ii,i1,i2,i3)
297 
298 
299 !This section has been created automatically by the script Abilint (TD).
300 !Do not modify the following lines by hand.
301 #undef ABI_FUNC
302 #define ABI_FUNC 'con_met'
303 !End of the abilint section
304 
305    real(dp) :: con_met
306    integer :: ii,i1,i2,i3
307    real(dp)::coniii,conijk
308 
309    coniii=gmet(i1,1)*gmet(i2,1)*gmet(i3,1)*aa(ii,1)+&
310 &   gmet(i1,2)*gmet(i2,2)*gmet(i3,2)*aa(ii,7)+&
311 &   gmet(i1,3)*gmet(i2,3)*gmet(i3,3)*aa(ii,10)
312    conijk=aa(ii,4)*&
313 &   (gmet(i1,1)*gmet(i2,2)*gmet(i3,3)+&
314 &   gmet(i1,2)*gmet(i2,3)*gmet(i3,1)+&
315 &   gmet(i1,3)*gmet(i2,1)*gmet(i3,2)+&
316 &   gmet(i1,3)*gmet(i2,2)*gmet(i3,1)+&
317 &   gmet(i1,1)*gmet(i2,3)*gmet(i3,2)+&
318 &   gmet(i1,2)*gmet(i2,1)*gmet(i3,3))
319    con_met=coniii+conijk+&
320 &   (gmet(i1,1)*gmet(i2,2)*gmet(i3,1)+&
321 &   gmet(i1,2)*gmet(i2,1)*gmet(i3,1)+&
322 &   gmet(i1,1)*gmet(i2,1)*gmet(i3,2))*aa(ii,6)+&
323 &   (gmet(i1,1)*gmet(i2,2)*gmet(i3,2)+&
324 &   gmet(i1,2)*gmet(i2,1)*gmet(i3,2)+&
325 &   gmet(i1,2)*gmet(i2,2)*gmet(i3,1))*aa(ii,2)+&
326 &   (gmet(i1,1)*gmet(i2,3)*gmet(i3,1)+&
327 &   gmet(i1,3)*gmet(i2,1)*gmet(i3,1)+&
328 &   gmet(i1,1)*gmet(i2,1)*gmet(i3,3))*aa(ii,5)+&
329 &   (gmet(i1,1)*gmet(i2,3)*gmet(i3,3)+&
330 &   gmet(i1,3)*gmet(i2,1)*gmet(i3,3)+&
331 &   gmet(i1,3)*gmet(i2,3)*gmet(i3,1))*aa(ii,3)+&
332 &   (gmet(i1,2)*gmet(i2,2)*gmet(i3,3)+&
333 &   gmet(i1,2)*gmet(i2,3)*gmet(i3,2)+&
334 &   gmet(i1,3)*gmet(i2,2)*gmet(i3,2))*aa(ii,9)+&
335 &   (gmet(i1,2)*gmet(i2,3)*gmet(i3,3)+&
336 &   gmet(i1,3)*gmet(i2,2)*gmet(i3,3)+&
337 &   gmet(i1,3)*gmet(i2,3)*gmet(i3,2))*aa(ii,8)
338 
339  end function con_met
340 
341 end subroutine metcon