function init_fullStartWeight(csf_i, sOrb, pOrb, negSwitches, &
posSwitches, bVal) result(fullStart)
type(CSF_Info_t), intent(in) :: csf_i
integer, intent(in) :: sOrb, pOrb
real(dp), intent(in) :: negSwitches, posSwitches
real(dp), intent(in) :: bVal
type(WeightObj_t) :: fullStart
character(*), parameter :: this_routine = "init_fullStartWeight"
type(WeightObj_t), target, save :: single
ASSERT(sOrb > 0 .and. sOrb <= nSpatOrbs)
ASSERT(pOrb > 0 .and. pOrb <= nSpatOrbs)
ASSERT(negSwitches >= 0.0_dp)
ASSERT(posSwitches >= 0.0_dp)
fullStart%dat%F = endFx(csf_i, sOrb)
fullStart%dat%G = endGx(csf_i, sOrb)
! have to set up a single weight obj.
single = init_singleWeight(csf_i, pOrb)
! try to reuse the already initialized singles weight in the cause of
! an excitation, i hope this works with the pointers and stuff.
fullstart%ptr => single
fullStart%dat%minus = single%proc%minus(negSwitches, bVal, single%dat)
fullStart%dat%plus = single%proc%plus(posSwitches, bVal, single%dat)
fullStart%proc%minus => getMinus_fullStart
fullStart%proc%plus => getPlus_fullStart
fullStart%proc%zero => getZero_fullStart
fullStart%initialized = .true.
end function init_fullStartWeight