picks three random unoccupied orbitals, given the occupied orbitals, ignoring symmetry This is a more efficient version of pick_three_orbs_sym for the case that point-group symmetry is not used
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
integer, | intent(in) | :: | nI(nel) | |||
integer, | intent(out) | :: | tgt(3) | |||
real(kind=dp), | intent(inout) | :: | pgen | |||
integer, | intent(in) | :: | ms |
subroutine pick_three_orbs_nosym(nI, tgt, pgen, ms)
integer, intent(in) :: nI(nel), ms
integer, intent(out) :: tgt(3)
real(dp), intent(inout) :: pgen
integer :: i, msCur, msOrb
msCur = ms
do i = 0, 2
! get the ms of this orb
! we take ms = 1 until the total leftover ms is negative
if (msCur > 0) then
msOrb = 1
else
! then we start taking ms = -1
msOrb = -1
end if
call get_rand_orb(nI, tgt, msOrb, i, pgen)
! the remaining ms
msCur = msCur - msOrb
end do
! adjust the probability by taking permutations into account
pgen = pgen * 2 * abs(ms)
end subroutine pick_three_orbs_nosym