get_valid_orbs Function

private function get_valid_orbs(this, csf_i, src_orb) result(valid_orbs)

Type Bound

PropVec_UniformExcGenerator_t

Arguments

Type IntentOptional Attributes Name
class(PropVec_UniformExcGenerator_t), intent(in) :: this
type(CSF_Info_t), intent(in) :: csf_i
integer, intent(in) :: src_orb

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