
use bitmasks

subroutine modify_bitmasks_for_hole(i_hole)
 implicit none
 integer, intent(in) :: i_hole
 integer :: i,j,k,l,m
 integer :: ispin
 BEGIN_DOC
! modify the generators_bitmask in order that one can only excite
! the electrons occupying i_hole
 END_DOC

 ! Set to Zero the holes
 do l = 1, 3
   i = index_holes_bitmask(l)
    do ispin=1,2
     do j = 1, N_int
      generators_bitmask(j,ispin,i) =   0_bit_kind
     enddo
    enddo
 enddo

 k = shiftr(i_hole-1,bit_kind_shift)+1
 j = i_hole-shiftl(k-1,bit_kind_shift)-1
 do l = 1, 3
   i = index_holes_bitmask(l)
   do ispin=1,2
    generators_bitmask(k,ispin,i) = ibset(generators_bitmask(k,ispin,i),j)
   enddo
 enddo

end

subroutine modify_bitmasks_for_hole_in_out(i_hole)
 implicit none
 integer, intent(in) :: i_hole
 integer :: i,j,k,l,m
 integer :: ispin
 BEGIN_DOC
! modify the generators_bitmask in order that one can only excite
! the electrons occupying i_hole
 END_DOC

 k = shiftr(i_hole-1,bit_kind_shift)+1
 j = i_hole-shiftl(k-1,bit_kind_shift)-1
 do l = 1, 3
   i = index_holes_bitmask(l)
   do ispin=1,2
    generators_bitmask(k,ispin,i) = ibset(generators_bitmask(k,ispin,i),j)
   enddo
 enddo

end

subroutine modify_bitmasks_for_particl(i_part)
 implicit none
 integer, intent(in) :: i_part
 integer :: i,j,k,l,m
 integer :: ispin
 BEGIN_DOC
! modify the generators_bitmask in order that one can only excite
! the electrons to the orbital i_part
 END_DOC

 ! Set to Zero the particles
 do l = 1, 3
   i = index_particl_bitmask(l)
   do ispin=1,2
     do j = 1, N_int
      generators_bitmask(j,ispin,i) =   0_bit_kind
     enddo
   enddo
 enddo

 k = shiftr(i_part-1,bit_kind_shift)+1
 j = i_part-shiftl(k-1,bit_kind_shift)-1
 do l = 1, 3
   i = index_particl_bitmask(l)
   do ispin=1,2
    generators_bitmask(k,ispin,i) = ibset(generators_bitmask(k,ispin,i),j)
   enddo
 enddo

end


subroutine set_bitmask_particl_as_input(input_bitmask)
 implicit none
 integer(bit_kind), intent(in) :: input_bitmask(N_int,2)
 integer :: i,j,k,l,m
 integer :: ispin
 BEGIN_DOC
! set the generators_bitmask for the particles
! as the input_bitmask
 END_DOC

 do l = 1, 3
   i = index_particl_bitmask(l)
   do ispin=1,2
     do j = 1, N_int
      generators_bitmask(j,ispin,i) =  input_bitmask(j,ispin)
     enddo
    enddo
 enddo
 touch generators_bitmask

end


subroutine set_bitmask_hole_as_input(input_bitmask)
 implicit none
 integer(bit_kind), intent(in) :: input_bitmask(N_int,2)
 integer :: i,j,k,l,m
 integer :: ispin
 BEGIN_DOC
! set the generators_bitmask for the holes
! as the input_bitmask
 END_DOC

 do l = 1, 3
   i = index_holes_bitmask(l)
    do ispin=1,2
     do j = 1, N_int
      generators_bitmask(j,ispin,i) =  input_bitmask(j,ispin)
     enddo
    enddo
 enddo
 touch generators_bitmask

end


subroutine print_generators_bitmasks_holes
 implicit none
 integer :: i,j,k,l
 integer(bit_kind),allocatable :: key_tmp(:,:)

 allocate(key_tmp(N_int,2))
 do l = 1, 3
   i = index_holes_bitmask(l)
   do j = 1, N_int
     key_tmp(j,1) = generators_bitmask(j,1,i)
     key_tmp(j,2) = generators_bitmask(j,2,i)
   enddo
!   print*,''
!   print*,'index hole  = ',i
!   call print_det(key_tmp,N_int)
!   print*,''
 enddo
 deallocate(key_tmp)

end

subroutine print_generators_bitmasks_particles
 implicit none
 integer :: i,j,k,l
 integer(bit_kind),allocatable :: key_tmp(:,:)

 allocate(key_tmp(N_int,2))
 do l = 1, 3
   i = index_particl_bitmask(l)
   do j = 1, N_int
     key_tmp(j,1) = generators_bitmask(j,1,i)
     key_tmp(j,2) = generators_bitmask(j,2,i)
   enddo
   print*,''
   print*,'index particl ',i
   call print_det(key_tmp,N_int)
   print*,''
 enddo
 deallocate(key_tmp)

end


BEGIN_PROVIDER [integer,  index_holes_bitmask, (3)]
 implicit none
 BEGIN_DOC
! Index of the holes in the generators_bitmasks
 END_DOC
 index_holes_bitmask(1) = d_hole1
 index_holes_bitmask(2) = d_hole2
 index_holes_bitmask(3) = s_hole

 END_PROVIDER

 BEGIN_PROVIDER [integer,  index_particl_bitmask, (3)]
 implicit none
 BEGIN_DOC
! Index of the holes in the generators_bitmasks
 END_DOC
 index_particl_bitmask(1) = d_part1
 index_particl_bitmask(2) = d_part2
 index_particl_bitmask(3) = s_part

 END_PROVIDER
