generate_imp_single_excitation Subroutine

private subroutine generate_imp_single_excitation(nI, ilut, nJ, ilutnJ, ex, tParity, pGen)

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: nI(nel)
integer(kind=n_int), intent(in) :: ilut(0:NIfTot)
integer, intent(out) :: nJ(nel)
integer(kind=n_int), intent(out) :: ilutnJ(0:NIfTot)
integer, intent(out) :: ex(2,2)
logical, intent(out) :: tParity
real(kind=dp), intent(inout) :: pGen

Contents


Source Code

    subroutine generate_imp_single_excitation(nI, ilut, nJ, ilutnJ, ex, tParity, pGen)
        integer, intent(in) :: nI(nel)
        integer, intent(out) :: nJ(nel), ex(2, 2)
        logical, intent(out) :: tParity
        real(dp), intent(inout) :: pGen
        integer(n_int), intent(in) :: ilut(0:NIfTot)
        integer(n_int), intent(out) :: ilutnJ(0:NIfTot)
        integer, allocatable :: destPool(:)
        integer :: randSource, randDest, iElec
        real(dp) :: r

        ! first, randomly pick an orb
        randSource = pick_source_el_single_excit(nI, ilut, iElec, pGen, destPool)
        ! Randomly select from the coupled unoccupied orbitals
        r = genrand_real2_dSFMT()
        randDest = destPool(int(size(destPool) * r) + 1)
        ! assign the output
        ! if the excitation is valid, generate the output
        call make_single(nI, nJ, iElec, randDest, ex, tParity)
        call assign_output_ilut(ilut, ilutnJ, randSource, randDest)
    end subroutine generate_imp_single_excitation