9
1
mirror of https://github.com/QuantumPackage/qp2.git synced 2024-12-23 12:03:30 +01:00

cleaned up mapping function

This commit is contained in:
Kevin Gasperich 2020-01-30 14:52:58 -06:00
parent 240c58c84f
commit 948b16d4c5

View File

@ -292,14 +292,30 @@ subroutine ao_two_e_integral_periodic_map_idx_sign(i,j,k,l,use_map1,idx,sign)
! use_map1: true if integral is in first ao map, false if integral is in second ao map ! use_map1: true if integral is in first ao map, false if integral is in second ao map
! idx: position of real part of integral in map (imag part is at idx+1) ! idx: position of real part of integral in map (imag part is at idx+1)
! sign: sign of imaginary part ! sign: sign of imaginary part
!
!
! for <ab|cd>, conditionals are [a<c, b<d, ac<bd]
! last three rows are real (ab==cd)
! +---------+---------+---------+---------+---------+---------+---------+---------+---------+
! | | <ij|kl> | <ji|lk> | <kl|ij> | <lk|ji> | <kj|il> | <jk|li> | <il|kj> | <li|jk> |
! +---------+---------+---------+---------+---------+---------+---------+---------+---------+
! | | m1 | m1* | m2 | m2* |
! +---------+---------+---------+---------+---------+---------+---------+---------+---------+
! | <ij|kl> | TTT | TTF | FFT | FFF | FTT | TFF | TFT | FTF |
! | <ij|il> | 0TT | T0F | 0FT | F0F | | | | |
! | <ij|kj> | T0T | 0TF | F0T | 0FF | | | | |
! | <ii|jj> | | | | | TT0 | | FF0 | |
! +---------+---------+---------+---------+---------+---------+---------+---------+---------+
! | <ji|ij> | FT0 | TF0 | | | | | | |
! | <ij|ij> | 00T | 00F | | | | | | |
! | <ii|ii> | 000 | | | | | | | |
! +---------+---------+---------+---------+---------+---------+---------+---------+---------+
END_DOC END_DOC
integer, intent(in) :: i,j,k,l integer, intent(in) :: i,j,k,l
integer(key_kind), intent(out) :: idx integer(key_kind), intent(out) :: idx
logical, intent(out) :: use_map1 logical, intent(out) :: use_map1
double precision, intent(out) :: sign double precision, intent(out) :: sign
integer(key_kind) :: p,q,r,s,ik,jl,ij,kl integer(key_kind) :: p,q,r,s,ik,jl,ij,kl
logical :: iltk, jltl, ikltjl, ieqk, jeql, ikeqjl, ijeqkl
! i.le.k, j.le.l, tri(i,k).le.tri(j,l)
!DIR$ FORCEINLINE !DIR$ FORCEINLINE
call two_e_integrals_index_periodic(i,j,k,l,idx,ik,jl) call two_e_integrals_index_periodic(i,j,k,l,idx,ik,jl)
p = min(i,j) p = min(i,j)
@ -309,45 +325,38 @@ subroutine ao_two_e_integral_periodic_map_idx_sign(i,j,k,l,use_map1,idx,sign)
s = max(k,l) s = max(k,l)
kl = q+shiftr(s*s-s,1) kl = q+shiftr(s*s-s,1)
idx = 2*idx-1 idx = 2*idx-1
if (ij==kl) then !real, map1 if (ij==kl) then !real, map1
sign=0.d0 sign=0.d0
use_map1=.True. use_map1=.True.
else else
iltk = (i.lt.k) if (ik.eq.jl) then
jltl = (j.lt.l) if (i.lt.k) then !TT0
ieqk = (i.eq.k)
jeql = (j.eq.l)
ikltjl = (ik.lt.jl)
ikeqjl = (ik.eq.jl)
if (ikeqjl) then
if (iltk) then
sign=1.d0 sign=1.d0
use_map1=.False. use_map1=.False.
else else !FF0
sign=-1.d0 sign=-1.d0
use_map1=.False. use_map1=.False.
endif endif
else if (ieqk) then else if (i.eq.k) then
if (jltl) then if (j.lt.l) then !0T*
sign=1.d0
use_map1=.True.
else !0F*
sign=-1.d0
use_map1=.True.
endif
else if (j.eq.l) then
if (i.lt.k) then
sign=1.d0 sign=1.d0
use_map1=.True. use_map1=.True.
else else
sign=-1.d0 sign=-1.d0
use_map1=.True. use_map1=.True.
endif endif
else if (jeql) then else if ((i.lt.k).eqv.(j.lt.l)) then
if (iltk) then if (i.lt.k) then
sign=1.d0
use_map1=.True.
else
sign=-1.d0
use_map1=.True.
endif
else if (iltk.eqv.jltl) then
if (iltk) then
sign=1.d0 sign=1.d0
use_map1=.True. use_map1=.True.
else else
@ -355,7 +364,7 @@ subroutine ao_two_e_integral_periodic_map_idx_sign(i,j,k,l,use_map1,idx,sign)
use_map1=.True. use_map1=.True.
endif endif
else else
if (jltl.eqv.ikltjl) then if ((j.lt.l).eqv.(ik.lt.jl)) then
sign=1.d0 sign=1.d0
use_map1=.False. use_map1=.False.
else else