subroutine fock_jk(basis, d, f, scalefactor, infos)
use precision, only: dp
use io_constants, only: iw
use util, only: measure_time
use basis_tools, only: basis_set
use types, only: information
use int2_compute, only: int2_compute_t, int2_fock_data_t, int2_rhf_data_t, int2_urohf_data_t
implicit none
type(basis_set), intent(in) :: basis
type(information), intent(inout) :: infos
real(kind=dp), optional, intent(in) :: scalefactor
integer :: i, ii, nf, nschwz
real(kind=dp) :: scalef
real(kind=dp), target, intent(in) :: d(:,:)
real(kind=dp), intent(inout) :: f(:,:)
type(int2_compute_t) :: int2_driver
class(int2_fock_data_t), allocatable :: int2_data
! Initial Settings
scalef = 1.0d0
if (present(scalefactor)) scalef = scalefactor
call measure_time(print_total=1, log_unit=iw)
write(iw,"(/3x,'Form Two-Electron J and K Fock')")
! Initialize ERI calculations
call int2_driver%init(basis, infos)
call int2_driver%set_screening()
int2_data = int2_rhf_data_t(nfocks=1, d=d, scale_exchange=scalefactor)
call flush(iw)
! Constructing two electron Fock matrix
call int2_driver%run(int2_data)
nschwz = int2_driver%skipped
! Scaling (everything except diagonal is halved)
f = 0.5 * int2_data%f(:,:,1)
do nf = 1, ubound(f,2)
ii = 0
do i = 1, basis%nbf
ii = ii + i
f(ii,nf) = 2*f(ii,nf)
end do
end do
call int2_driver%clean()
end subroutine fock_jk