count_frozen_inds Function

private pure function count_frozen_inds(indices) result(level)

Count how many frozen indices there are, determine if the entry has to be added to a lower-order term and if yes, which one. @param[in] indices array of size 6 with the orbital indices of the entry @return level indicates to which lower order term this entry has to be added and therefore, which subroutine has to be called in the following 0 - none 1 - one frozen index pair -> two-body term 2 - two frozen index pairs -> one-body term 3 - three frozen index pairs -> diagonal term

Arguments

Type IntentOptional Attributes Name
integer(kind=int64), intent(in) :: indices(num_inds)

Return Value integer


Contents

Source Code


Source Code

    pure function count_frozen_inds(indices) result(level)
        integer(int64), intent(in) :: indices(num_inds)
        integer :: level
        integer :: counts

        integer :: ct
        level = 0
        ! If there is an unpaired frozen orbital, the entry is discarded, it does not
        ! contribute to any contraction
        do ct = 1, num_inds
            if(count(indices(ct) == indices) == 1 .and. indices(ct) < 1) return
        end do
        ! Else, it contributes to a contraction according to the number of frozen indices
        counts = count(indices < 1)
        ! An even number of frozen orbital indices is required
        if(modulo(counts, 2) /= 0) return

        level = counts.div.2

    end function count_frozen_inds