2021-02-17 14:59:25 +01:00
|
|
|
integer*8 function configuration_search_key(cfg,Nint)
|
|
|
|
use bitmasks
|
|
|
|
implicit none
|
|
|
|
BEGIN_DOC
|
|
|
|
! Returns an integer*8 corresponding to a determinant index for searching.
|
|
|
|
! The left-most 8 bits contain the number of open shells+1. This ensures that the CSF
|
|
|
|
! are packed with the same seniority.
|
|
|
|
END_DOC
|
|
|
|
integer, intent(in) :: Nint
|
|
|
|
integer(bit_kind), intent(in) :: cfg(Nint,2)
|
|
|
|
integer :: i, n_open_shells
|
|
|
|
integer*8 :: mask
|
|
|
|
|
|
|
|
i = shiftr(elec_alpha_num, bit_kind_shift)+1
|
|
|
|
configuration_search_key = int(shiftr(ior(cfg(i,1),cfg(i,2)),1)+sum(cfg),8)
|
|
|
|
|
2021-04-19 23:57:28 +02:00
|
|
|
mask = int(Z'00FFFFFFFFFFFFFF',8)
|
2021-02-17 14:59:25 +01:00
|
|
|
configuration_search_key = iand(mask,configuration_search_key)
|
|
|
|
|
|
|
|
n_open_shells = 1
|
|
|
|
do i=1,Nint
|
|
|
|
if (cfg(i,1) == 0_bit_kind) cycle
|
|
|
|
n_open_shells = n_open_shells + popcnt(cfg(i,1))
|
|
|
|
enddo
|
|
|
|
mask = n_open_shells
|
|
|
|
mask = shiftl(mask,56)
|
|
|
|
configuration_search_key = ior (mask,configuration_search_key)
|
|
|
|
|
|
|
|
end
|