4
1
mirror of https://github.com/pfloos/quack synced 2024-11-13 09:34:04 +01:00
quack/src/IntPak/ComputeKin.f90

168 lines
5.2 KiB
Fortran
Raw Normal View History

2019-02-07 22:49:12 +01:00
subroutine ComputeKin(debug,nShell, &
CenterShell,TotAngMomShell,KShell,DShell,ExpShell, &
npKin,nSigpKin,ncKin,nSigcKin)
! Compute one-electron kinetic integrals
implicit none
include 'parameters.h'
! Input variables
logical,intent(in) :: debug
integer,intent(in) :: nShell
double precision,intent(in) :: CenterShell(maxShell,3)
integer,intent(in) :: TotAngMomShell(maxShell),KShell(maxShell)
double precision,intent(in) :: DShell(maxShell,maxK),ExpShell(maxShell,maxK)
! Local variables
integer :: KA,KB
double precision :: CenterA(3),CenterB(3)
integer :: TotAngMomA,TotAngMomB
integer :: AngMomA(3),AngMomB(3)
integer :: nShellFunctionA,nShellFunctionB
integer,allocatable :: ShellFunctionA(:,:),ShellFunctionB(:,:)
double precision :: ExpA,ExpB
double precision,allocatable :: DA,DB
2019-03-20 13:38:42 +01:00
double precision :: norm_coeff
2019-02-07 22:49:12 +01:00
integer :: iBasA,iBasB
integer :: iShA,iShB
integer :: iShFA,iShFB
integer :: iKA,iKB
double precision :: pKin,cKin
double precision :: start_cKin,end_cKin,t_cKin
! Output variables
integer,intent(out) :: npKin,nSigpKin,ncKin,nSigcKin
! Compute one-electron integrals
write(*,*) '****************************************'
write(*,*) ' Compute one-electron kinetic integrals '
write(*,*) '****************************************'
write(*,*)
npKin = 0
nSigpKin = 0
ncKin = 0
nSigcKin = 0
iBasA = 0
iBasB = 0
! Open file to write down integrals
open(unit=9,file='int/Kin.dat')
!------------------------------------------------------------------------
! Loops over shell A
!------------------------------------------------------------------------
do iShA=1,nShell
CenterA(1) = CenterShell(iShA,1)
CenterA(2) = CenterShell(iShA,2)
CenterA(3) = CenterShell(iShA,3)
TotAngMomA = TotAngMomShell(iShA)
nShellFunctionA = (TotAngMomA*TotAngMomA + 3*TotAngMomA + 2)/2
allocate(ShellFunctionA(1:nShellFunctionA,1:3))
call GenerateShell(TotAngMomA,nShellFunctionA,ShellFunctionA)
KA = KShell(iShA)
do iShFA=1,nShellFunctionA
iBasA = iBasA + 1
AngMomA(1) = ShellFunctionA(iShFA,1)
AngMomA(2) = ShellFunctionA(iShFA,2)
AngMomA(3) = ShellFunctionA(iShFA,3)
!------------------------------------------------------------------------
! Loops over shell B
!------------------------------------------------------------------------
do iShB=1,nShell
CenterB(1) = CenterShell(iShB,1)
CenterB(2) = CenterShell(iShB,2)
CenterB(3) = CenterShell(iShB,3)
TotAngMomB = TotAngMomShell(iShB)
nShellFunctionB = (TotAngMomB*TotAngMomB + 3*TotAngMomB + 2)/2
allocate(ShellFunctionB(1:nShellFunctionB,1:3))
call GenerateShell(TotAngMomB,nShellFunctionB,ShellFunctionB)
KB = KShell(iShB)
do iShFB=1,nShellFunctionB
iBasB = iBasB + 1
AngMomB(1) = ShellFunctionB(iShFB,1)
AngMomB(2) = ShellFunctionB(iShFB,2)
AngMomB(3) = ShellFunctionB(iShFB,3)
!------------------------------------------------------------------------
! Loops over contraction degrees
!-------------------------------------------------------------------------
call cpu_time(start_cKin)
cKin = 0d0
do iKA=1,KA
ExpA = ExpShell(iShA,iKA)
2019-03-20 13:38:42 +01:00
DA = DShell(iShA,iKA)*norm_coeff(ExpA,AngMomA)
2019-02-07 22:49:12 +01:00
do iKB=1,KB
ExpB = ExpShell(iShB,iKB)
2019-03-20 13:38:42 +01:00
DB = DShell(iShB,iKB)*norm_coeff(ExpB,AngMomB)
2019-02-07 22:49:12 +01:00
call KinInt(npKin,nSigpKin, &
ExpA,CenterA,AngMomA, &
ExpB,CenterB,AngMomB, &
pKin)
cKin = cKin + DA*DB*pKin
2019-03-20 13:38:42 +01:00
end do
end do
2019-02-07 22:49:12 +01:00
call cpu_time(end_cKin)
ncKin = ncKin + 1
if(abs(cKin) > 1d-15) then
nSigcKin = nSigcKin + 1
t_cKin = end_cKin - start_cKin
write(9,'(I6,I6,F20.15)') iBasA,iBasB,cKin
2019-03-31 22:28:04 +02:00
! write(9,'(F20.15,I6,I6)') cKin,iBasA,iBasB
2019-02-07 22:49:12 +01:00
if(debug) then
write(*,'(A10,1X,F16.10,1X,I6,1X,I6)') '(a|T|b) = ',cKin,iBasA,iBasB
2019-03-20 13:38:42 +01:00
end if
end if
2019-02-07 22:49:12 +01:00
!------------------------------------------------------------------------
! End loops over contraction degrees
!------------------------------------------------------------------------
2019-03-20 13:38:42 +01:00
end do
2019-02-07 22:49:12 +01:00
deallocate(ShellFunctionB)
2019-03-20 13:38:42 +01:00
end do
2019-02-07 22:49:12 +01:00
iBasB = 0
!------------------------------------------------------------------------
! End loops over shell B
!------------------------------------------------------------------------
2019-03-20 13:38:42 +01:00
end do
2019-02-07 22:49:12 +01:00
deallocate(ShellFunctionA)
2019-03-20 13:38:42 +01:00
end do
2019-02-07 22:49:12 +01:00
iBasA = 0
!------------------------------------------------------------------------
! End loops over shell A
!------------------------------------------------------------------------
write(*,*)
! Close files to write down integrals
close(unit=9)
end subroutine ComputeKin