subroutine init_back_spawn()
! init routine
character(*), parameter :: this_routine = "init_back_spawn"
! also add some output so people know we use this method
root_print "BACK-SPAWNING method in use! "
if (t_back_spawn_flex) then
root_print "Flex option in use: we pick the electrons randomly"
root_print " and then decide, where to pick the orbitals from "
root_print " depending where the electrons are relative to the ref"
else
root_print "For non-initiators we only pick electrons from the virtual"
root_print " orbitals of the reference determinant!"
root_print " so non-initiators only lower or keep the excitation level constant!"
end if
if (t_back_spawn_occ_virt) then
root_print "additionally option to pick the first orbital (a) from "
root_print " the occupied manifold of the reference is activated!"
end if
! first it only makes sense if we actually use the initiator method
if (.not. tTruncInitiator) then
call stop_all(this_routine, &
"back spawning makes only sense in the initiator method!")
end if
if (.not. tGen_4ind_2) then
if (.not. (tHub .or. tUEG)) then
call stop_all(this_routine, &
"for molecular systems this back-spawning need 4ind-weighted-2 or above!")
end if
end if
if (tGen_4ind_2_symmetric) then
call stop_all(this_routine, &
"back-spawning not compatible with symmetric excitation generator!")
end if
if (tUEG .and. t_back_spawn) then
if (.not. tUEGNewGenerator) then
call stop_all(this_routine, &
"the old UEG excitation generator only works with back-spawn-flex")
end if
end if
if (tReadPops) then
if (back_spawn_delay /= 0) then
root_print "WARNING: "
root_print "Restarting from POPSFILE but using a delayed back-spawn! "
root_print " Are you sure? "
end if
end if
call setup_virtual_mask()
! also change the max excitation level calculated
max_calc_ex_level = nel
end subroutine init_back_spawn