pick_random_unocc_impurity Function

private function pick_random_unocc_impurity(nI, ms, pgen) result(i)

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: nI(nel)
integer, intent(in) :: ms
real(kind=dp), intent(inout) :: pgen

Return Value integer


Contents


Source Code

    function pick_random_unocc_impurity(nI, ms, pgen) result(i)
        integer, intent(in) :: nI(nel)
        integer, intent(in) :: ms
        real(dp), intent(inout) :: pgen
        integer :: i

        real(dp) :: r
        integer :: pool(nImp)
        integer :: j, nEmpty
        logical :: tEmpty(nImp)

        ! First, get the unoccupied impurity sites
        do j = 1, nImp
            tEmpty(j) = (all(nI /= ImpuritySites(j)) .and. G1(ImpuritySites(j))%Ms == ms)
        end do
        pool = pack(ImpuritySites, tEmpty, vector=ImpuritySites)
        nEmpty = count(tEmpty)

        r = genrand_real2_dSFMT()
        i = pool(int(r * nEmpty) + 1)

        ! Adjust pgen
        pgen = pgen * 1.0 / nEmpty

    end function pick_random_unocc_impurity