 BEGIN_PROVIDER [double precision, short_range_Hartree_operator, (mo_num,mo_num,N_states)]
&BEGIN_PROVIDER [double precision, short_range_Hartree, (N_states)]
 implicit none
 BEGIN_DOC
! short_range_Hartree_operator(i,j) = $\int dr i(r)j(r) \int r' \rho(r') W_{ee}^{sr}$
!
! short_range_Hartree = $1/2  \sum_{i,j} \rho_{ij} \mathtt{short_range_Hartree_operator}(i,j)$
!
!                     = $1/2  \int dr \int r' \rho(r) \rho(r') W_{ee}^{sr}$
 END_DOC
 integer :: i,j,k,l,m,n,istate
 double precision :: get_two_e_integral,get_mo_two_e_integral_erf
 double precision :: integral, integral_erf, contrib
 double precision :: integrals_array(mo_num,mo_num),integrals_erf_array(mo_num,mo_num)
 short_range_Hartree_operator = 0.d0
 short_range_Hartree = 0.d0
 do i = 1, mo_num
  do j = 1, mo_num
   if(dabs(one_e_dm_average_mo_for_dft(j,i)).le.1.d-12)cycle
   call get_mo_two_e_integrals_i1j1(i,j,mo_num,integrals_array,mo_integrals_map)
   call get_mo_two_e_integrals_erf_i1j1(i,j,mo_num,integrals_erf_array,mo_integrals_erf_map)
   do istate = 1, N_states
    do k = 1, mo_num
     do l = 1, mo_num
      integral = integrals_array(l,k)
      integral_erf = integrals_erf_array(l,k)
      contrib = one_e_dm_mo_for_dft(i,j,istate) * (integral  - integral_erf)
      short_range_Hartree_operator(l,k,istate) += contrib
      short_range_Hartree(istate) += contrib * one_e_dm_mo_for_dft(k,l,istate)
     enddo
    enddo
   enddo
  enddo
 enddo
 short_range_Hartree = short_range_Hartree * 0.5d0
 print*, 'short_range_Hartree',short_range_Hartree
END_PROVIDER


 BEGIN_PROVIDER [double precision, regular_range_Hartree_operator, (mo_num,mo_num,N_states)]
&BEGIN_PROVIDER [double precision, regular_range_Hartree, (N_states)]
 implicit none
 BEGIN_DOC
! regular_range_Hartree_operator(i,j) = $\int dr i(r)j(r) \int r' \rho(r') W_{ee}^{sr}$
!
! regular_range_Hartree = $1/2  \sum_{i,j} \rho_{ij} \mathtt{regular_range_Hartree_operator}(i,j)$
!
!                     = $1/2  \int dr \int r' \rho(r) \rho(r') W_{ee}^{sr}$
 END_DOC
 integer :: i,j,k,l,m,n,istate
 double precision :: get_two_e_integral
 double precision :: integral, contrib
 double precision :: integrals_array(mo_num,mo_num)
 regular_range_Hartree_operator = 0.d0
 regular_range_Hartree = 0.d0
 do i = 1, mo_num
  do j = 1, mo_num
   if(dabs(one_e_dm_average_mo_for_dft(j,i)).le.1.d-12)cycle
   call get_mo_two_e_integrals_i1j1(i,j,mo_num,integrals_array,mo_integrals_map)
   do istate = 1, N_states
    do k = 1, mo_num
     do l = 1, mo_num
      integral = integrals_array(l,k)
      contrib = one_e_dm_mo_for_dft(i,j,istate) * integral 
      regular_range_Hartree_operator(l,k,istate) += contrib
      regular_range_Hartree(istate) += contrib * one_e_dm_mo_for_dft(k,l,istate)
     enddo
    enddo
   enddo
  enddo
 enddo
 regular_range_Hartree = regular_range_Hartree * 0.5d0
 print*, 'regular_range_Hartree',regular_range_Hartree
END_PROVIDER
