create a pool of unoccupied orbitals with a given symmetry
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer, | intent(in) | :: | nI(nel) |
spin of the pool. ms>0 is alpha, ms<0 beta |
||
| integer, | intent(inout) | :: | tgt(3) | |||
| integer, | intent(in) | :: | ms |
spin of the pool. ms>0 is alpha, ms<0 beta |
||
| integer, | intent(out), | allocatable | :: | pool(:) | ||
| integer, | intent(in) | :: | nPicked |
spin of the pool. ms>0 is alpha, ms<0 beta number of already picked target orbitals |
||
| integer, | intent(in) | :: | tgt_sym |
symmetry of the pool |
||
| integer, | intent(in) | :: | cc_unocc(ScratchSize) |
subroutine create_sym_pool(nI, tgt, ms, pool, nPicked, tgt_sym, cc_unocc) integer, intent(inout) :: tgt(3) integer, intent(in) :: ms, nI(nel), nPicked integer, allocatable, intent(out) :: pool(:) integer, intent(in) :: tgt_sym integer, intent(in) :: cc_unocc(ScratchSize) integer :: i, pool_size, k, cc_ind, spin_ind if (ms > 0) then spin_ind = 1 else spin_ind = 2 end if ! get the number of possible orbitals cc_ind = ClassCountInd(spin_ind, tgt_sym, 0) pool_size = cc_unocc(cc_ind) ! we need to see how many same spin orbs have been picked so far do i = 1, nPicked if ((sign(1, ms) == G1(tgt(i))%Ms) .and. & G1(tgt(i))%Sym%S == tgt_sym) pool_size = pool_size - 1 end do allocate(pool(pool_size)) k = 0 do i = 1, nBasis ! Check if this has the right spin if ((ms > 0 .neqv. is_beta(i)) .and. (G1(i)%Sym%S == tgt_sym)) then ! Check if the orb is both unocc and if (all(tgt(1:nPicked) /= i) .and. all(nI /= i)) then k = k + 1 pool(k) = i end if end if end do if (k /= pool_size) then write(stdout, *) "Error: wrong number of targets", k, "/=", pool_size call stop_all('create_sym_pool', 'size mismatch') end if end subroutine create_sym_pool