private function get_valid_orbs(this, csf_i, src_orb) result(valid_orbs)
Type Bound
PropVec_UniformExcGenerator_t
Arguments
Return Value
integer, allocatable, (:)
Source Code
function get_valid_orbs(this, csf_i, src_orb) result(valid_orbs)
class(PropVec_UniformExcGenerator_t), intent(in) :: this
type(CSF_Info_t), intent(in) :: csf_i
integer, intent(in) :: src_orb
integer, allocatable :: valid_orbs(:)
integer(n_int) :: &
ilut_doubly_occupied(0:this%L_spat_bits), ilut_valid(0:this%L_spat_bits)
integer :: i_sg
if (this%use_lookup) then
i_sg = this%indexer%lookup_prop_vec_idx(csf_I)
else
i_sg = this%indexer%idx_csf(csf_i)
end if
block
integer, allocatable :: doubly_occupied(:)
integer :: i
doubly_occupied = pack([(i, i=1, size(csf_i%stepvector))], csf_i%stepvector == 3)
ilut_doubly_occupied = 0_n_int
do i = 1, size(doubly_occupied)
set_orb(ilut_doubly_occupied, doubly_occupied(i))
end do
endblock
ilut_valid = iand(this%allowed_holes(:, src_orb, i_sg), not(ilut_doubly_occupied))
allocate(valid_orbs(sum(popcnt(ilut_valid))))
if (size(valid_orbs) /= 0) then
call decode_bit_det(valid_orbs, ilut_valid)
end if
end function get_valid_orbs