 BEGIN_PROVIDER [ double precision, diagonal_Fock_matrix_mo, (ao_num) ]
&BEGIN_PROVIDER [ double precision, eigenvectors_Fock_matrix_mo, (ao_num_align,mo_tot_num) ]
   implicit none
   BEGIN_DOC
   ! Diagonal Fock matrix in the MO basis
   END_DOC
   
   integer                        :: i,j
   integer                        :: liwork, lwork, n, info
   integer, allocatable           :: iwork(:)
   double precision, allocatable  :: work(:), F(:,:), S(:,:)
   
   allocate(F(ao_num_align,ao_num), S(ao_num_align,ao_num) )
   do j=1,ao_num
     do i=1,ao_num
       S(i,j) = ao_overlap(i,j)
       F(i,j) = Fock_matrix_ao(i,j)
     enddo
   enddo

   n = ao_num
   lwork = 1+6*n + 2*n*n
   liwork = 3 + 5*n
   
   allocate(work(lwork), iwork(liwork) )

   lwork = -1
   liwork = -1
   call dsygvd(1,'v','u',ao_num,F,size(F,1),S,size(S,1),&
     diagonal_Fock_matrix_mo, work, lwork, iwork, liwork, info)

   if (info /= 0) then
     print *,  irp_here//' failed'
     stop 1
   endif
   lwork = int(work(1))
   liwork = iwork(1)
   deallocate(work,iwork)
   allocate(work(lwork), iwork(liwork) )

   call dsygvd(1,'v','u',ao_num,F,size(F,1),S,size(S,1),&
     diagonal_Fock_matrix_mo, work, lwork, iwork, liwork, info)

   if (info /= 0) then
     print *,  irp_here//' failed'
     stop 1
   endif
   do j=1,mo_tot_num
     do i=1,ao_num
       eigenvectors_Fock_matrix_mo(i,j) = F(i,j)
     enddo
   enddo

   deallocate(work, iwork, F, S)
END_PROVIDER
 
BEGIN_PROVIDER [double precision, diagonal_Fock_matrix_mo_sum, (mo_tot_num)]
 implicit none
 BEGIN_DOC
 ! diagonal element of the fock matrix calculated as the sum over all the interactions 
 ! with all the electrons in the RHF determinant
 ! diagonal_Fock_matrix_mo_sum(i) = sum_{j=1, N_elec} 2 J_ij -K_ij 
 END_DOC
 integer :: i,j
 double precision :: accu
 do i = 1,elec_alpha_num
  accu = 0.d0
  do j = 1, elec_alpha_num
   accu += 2.d0 * mo_bielec_integral_jj_from_ao(i,j) - mo_bielec_integral_jj_exchange_from_ao(i,j)
  enddo
  diagonal_Fock_matrix_mo_sum(i) = accu + mo_mono_elec_integral(i,i)
 enddo
 do i = elec_alpha_num+1,mo_tot_num
  accu = 0.d0
  do j = 1, elec_alpha_num
   accu += 2.d0 * mo_bielec_integral_jj_from_ao(i,j) - mo_bielec_integral_jj_exchange_from_ao(i,j)
  enddo
  diagonal_Fock_matrix_mo_sum(i) = accu + mo_mono_elec_integral(i,i)
 enddo

END_PROVIDER
