2019-02-07 22:49:12 +01:00
|
|
|
function G2eInt(debug,iType, &
|
|
|
|
ExpG, &
|
|
|
|
ExpBra,CenterBra,AngMomBra, &
|
|
|
|
ExpKet,CenterKet,AngMomKet)
|
|
|
|
|
|
|
|
! Compute recursively the primitive two-electron integral [ab|cd]
|
|
|
|
|
|
|
|
implicit none
|
|
|
|
include 'parameters.h'
|
|
|
|
|
|
|
|
|
|
|
|
! Input variables
|
|
|
|
|
|
|
|
logical,intent(in) :: debug
|
|
|
|
integer,intent(in) :: iType
|
|
|
|
double precision,intent(in) :: ExpBra(2),ExpKet(2)
|
|
|
|
double precision,intent(in) :: ExpG
|
|
|
|
double precision,intent(in) :: CenterBra(2,3),CenterKet(2,3)
|
|
|
|
integer,intent(in) :: AngMomBra(2,3),AngMomKet(2,3)
|
|
|
|
|
|
|
|
! Local variables
|
|
|
|
|
|
|
|
integer :: TotAngMomBra(3),TotAngMomKet(3)
|
|
|
|
double precision :: ExpZi(2),ExpY(2,2)
|
|
|
|
double precision :: CenterZ(2,3),CenterAB(2,3),CenterZA(2,3),CenterY(2,2,3)
|
|
|
|
double precision :: NormABSq(2),NormYSq(2,2)
|
|
|
|
double precision :: GAB(2)
|
|
|
|
double precision,allocatable :: Om(:)
|
|
|
|
double precision :: fG
|
|
|
|
double precision :: HRR2e,VRR2e
|
|
|
|
double precision :: a1a2b1b2
|
|
|
|
|
|
|
|
integer :: i,j,k,maxm
|
|
|
|
double precision :: start_Om,finish_Om,start_RR,finish_RR,t_Om,t_RR
|
|
|
|
|
|
|
|
! Output variables
|
|
|
|
double precision :: G2eInt
|
|
|
|
|
|
|
|
! Pre-computed shell-pair quantities
|
|
|
|
|
|
|
|
do i=1,2
|
|
|
|
ExpZi(i) = 1d0/(ExpBra(i) + ExpKet(i))
|
2019-03-20 13:38:42 +01:00
|
|
|
end do
|
2019-02-07 22:49:12 +01:00
|
|
|
|
|
|
|
NormABSq = 0d0
|
|
|
|
do j=1,3
|
|
|
|
do i=1,2
|
|
|
|
CenterZ(i,j) = (ExpBra(i)*CenterBra(i,j) + ExpKet(i)*CenterKet(i,j))*ExpZi(i)
|
|
|
|
CenterAB(i,j) = CenterBra(i,j) - CenterKet(i,j)
|
|
|
|
CenterZA(i,j) = CenterZ(i,j) - CenterBra(i,j)
|
|
|
|
NormABSq(i) = NormABSq(i) + CenterAB(i,j)**2
|
2019-03-20 13:38:42 +01:00
|
|
|
end do
|
|
|
|
end do
|
2019-02-07 22:49:12 +01:00
|
|
|
|
|
|
|
do i=1,2
|
|
|
|
GAB(i) = (pi*ExpZi(i))**(1.5d0)*exp(-ExpBra(i)*ExpKet(i)*NormABSq(i)*ExpZi(i))
|
2019-03-20 13:38:42 +01:00
|
|
|
end do
|
2019-02-07 22:49:12 +01:00
|
|
|
|
|
|
|
! Pre-computed shell-quartet quantities
|
|
|
|
|
|
|
|
do i=1,2
|
|
|
|
do j=1,2
|
|
|
|
ExpY(i,j) = 1d0/(ExpZi(i) + ExpZi(j))
|
2019-03-20 13:38:42 +01:00
|
|
|
end do
|
|
|
|
end do
|
2019-02-07 22:49:12 +01:00
|
|
|
|
|
|
|
do i=1,2
|
|
|
|
do j=1,2
|
|
|
|
NormYSq(i,j) = 0d0
|
|
|
|
do k=1,3
|
|
|
|
CenterY(i,j,k) = CenterZ(i,k) - CenterZ(j,k)
|
|
|
|
NormYSq(i,j) = NormYSq(i,j) + CenterY(i,j,k)**2
|
2019-03-20 13:38:42 +01:00
|
|
|
end do
|
|
|
|
end do
|
|
|
|
end do
|
2019-02-07 22:49:12 +01:00
|
|
|
|
|
|
|
! fG = (ExpZ(1)*ExpZ(2)*ExpG)/(ExpZ(1)*ExpZ(2) + ExpZ(1)*ExpG + ExpZ(2)*ExpG)
|
|
|
|
fG = 1d0/(ExpZi(1) + 1d0/ExpG + ExpZi(2))
|
|
|
|
|
|
|
|
! Total angular momemtum
|
|
|
|
|
|
|
|
maxm = 0
|
|
|
|
do i=1,2
|
|
|
|
TotAngMomBra(i) = AngMomBra(i,1) + AngMomBra(i,2) + AngMomBra(i,3)
|
|
|
|
TotAngMomKet(i) = AngMomKet(i,1) + AngMomKet(i,2) + AngMomKet(i,3)
|
|
|
|
maxm = maxm + TotAngMomBra(i) + TotAngMomKet(i)
|
2019-03-20 13:38:42 +01:00
|
|
|
end do
|
2019-02-07 22:49:12 +01:00
|
|
|
|
|
|
|
! Pre-compute (00|00)^m
|
|
|
|
|
|
|
|
allocate(Om(0:maxm))
|
|
|
|
call cpu_time(start_Om)
|
|
|
|
|
|
|
|
if(iType == 1) then
|
|
|
|
call CalcOmERI(maxm,ExpY(1,2),NormYSq(1,2),Om)
|
|
|
|
elseif(iType == 3) then
|
|
|
|
call CalcOmYuk(maxm,ExpG,ExpY(1,2),fG,NormYSq(1,2),Om)
|
|
|
|
elseif(iType == 4) then
|
|
|
|
call CalcOmErf(maxm,ExpY(1,2),fG,NormYSq(1,2),Om)
|
2019-03-20 13:38:42 +01:00
|
|
|
end if
|
2019-02-07 22:49:12 +01:00
|
|
|
|
|
|
|
call cpu_time(finish_Om)
|
|
|
|
|
|
|
|
! Print (00|00)^m
|
|
|
|
|
|
|
|
if(debug) then
|
|
|
|
write(*,*) '(00|00)^m'
|
|
|
|
do i=0,maxm
|
|
|
|
write(*,*) i,Om(i)
|
2019-03-20 13:38:42 +01:00
|
|
|
end do
|
2019-02-07 22:49:12 +01:00
|
|
|
write(*,*)
|
2019-03-20 13:38:42 +01:00
|
|
|
end if
|
2019-02-07 22:49:12 +01:00
|
|
|
|
|
|
|
!------------------------------------------------------------------------
|
|
|
|
! Launch reccurence relations!
|
|
|
|
!------------------------------------------------------------------------
|
|
|
|
call cpu_time(start_RR)
|
|
|
|
|
|
|
|
if(TotAngMomKet(1) == 0 .and. TotAngMomKet(2) == 0) then
|
|
|
|
if(TotAngMomBra(1) == 0 .and. TotAngMomBra(2) == 0) then
|
|
|
|
a1a2b1b2 = Om(0)
|
|
|
|
else
|
|
|
|
a1a2b1b2 = VRR2e(0,AngMomBra,maxm,Om,ExpZi,ExpY,CenterZA,CenterY)
|
2019-03-20 13:38:42 +01:00
|
|
|
end if
|
2019-02-07 22:49:12 +01:00
|
|
|
else
|
|
|
|
a1a2b1b2 = HRR2e(AngMomBra,AngMomKet,maxm,Om,ExpZi,ExpY,CenterAB,CenterZA,CenterY)
|
2019-03-20 13:38:42 +01:00
|
|
|
end if
|
2019-02-07 22:49:12 +01:00
|
|
|
|
|
|
|
call cpu_time(finish_RR)
|
|
|
|
|
|
|
|
! Timings
|
|
|
|
|
|
|
|
t_Om = finish_Om - start_Om
|
|
|
|
t_RR = finish_RR - start_RR
|
|
|
|
|
|
|
|
! Print result
|
|
|
|
|
|
|
|
G2eInt = GAB(1)*GAB(2)*a1a2b1b2
|
|
|
|
|
|
|
|
end function G2eInt
|