initalises the spinorb-resolved PCHB doubles excitation generator
more specifically, sets up a lookup table for ab -> (a,b) and sets up the alias table for picking ab given ij with prob ~ Hijab
GAS_PCHB_DoublesSpinOrbFastWeightedExcGenerator_t
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(GAS_PCHB_DoublesSpinOrbFastWeightedExcGenerator_t), | intent(inout) | :: | this | |||
class(GASSpec_t), | intent(in) | :: | GAS_spec | |||
logical, | intent(in) | :: | use_lookup | |||
logical, | intent(in) | :: | create_lookup | |||
type(PCHB_ParticleSelection_t), | intent(in) | :: | PCHB_particle_selection |
subroutine GAS_doubles_PCHB_spinorb_init(this, GAS_spec, use_lookup, &
create_lookup, PCHB_particle_selection)
!! initalises the spinorb-resolved PCHB doubles excitation generator
!!
!! more specifically, sets up a lookup table for ab -> (a,b) and
!! sets up the alias table for picking ab given ij with prob ~ Hijab
class(GAS_PCHB_DoublesSpinOrbFastWeightedExcGenerator_t), intent(inout) :: this
class(GASSpec_t), intent(in) :: GAS_spec
logical, intent(in) :: use_lookup, create_lookup
type(PCHB_ParticleSelection_t), intent(in) :: PCHB_particle_selection
character(*), parameter :: this_routine = 'GAS_doubles_PCHB_spinorb_init'
integer :: AB, A, B, abMax, nBI
this%GAS_spec = GAS_spec
allocate(this%indexer, source=SuperGroupIndexer_t(GAS_spec, nEl))
this%create_lookup = create_lookup
this%use_lookup = use_lookup
if (this%create_lookup) then
if (associated(lookup_supergroup_indexer)) then
call stop_all(this_routine, 'Someone else is already managing the supergroup lookup.')
else
write(stdout, *) 'GAS PCHB (spinorb) doubles is creating and managing the supergroup lookup'
lookup_supergroup_indexer => this%indexer
end if
end if
if (this%use_lookup) write(stdout, *) 'GAS PCHB doubles is using the supergroup lookup'
write(stdout, *) "Allocating PCHB excitation generator objects"
! number of *spin* orbs
nBI = this%GAS_spec%n_spin_orbs()
! initialize the mapping ab -> (a, b)
abMax = fuseIndex(nBI, nBI)
allocate(this%tgtOrbs(2, 0:abMax), source=0)
do A = 1, nBI
do B = 1, A
AB = fuseIndex(A, B)
! b comes first as this is an ordered list
this%tgtOrbs(1, AB) = B
this%tgtOrbs(2, AB) = A
end do
end do
! set up the alias table
call this%compute_samplers(nBI, PCHB_particle_selection)
write(stdout, *) "Finished excitation generator initialization"
end subroutine GAS_doubles_PCHB_spinorb_init