function get_pchb_integral_contrib(i, j, a, b, typ) result(integral)
! specialized function to obtain the guga-integral contrib for
! the pchb weights
integer, intent(in) :: a, i, b, j, typ
real(dp) :: integral
debug_function_name("get_pchb_integral_contrib")
logical :: flag_
HElement_t(dp) :: cpt1, cpt2, cpt3, cpt4
ASSERT(0 < a .and. a <= nSpatOrbs)
ASSERT(0 < i .and. i <= nSpatOrbs)
ASSERT(0 < b .and. b <= nSpatOrbs)
ASSERT(0 < j .and. j <= nSpatOrbs)
if (t_old_pchb) then
integral = get_guga_integral_contrib_spat([i,j],a,b)
return
end if
flag_ = t_exchange_pchb
select case (typ)
! i need to get the correct indices for the integral contributions!
case (excit_type%single_overlap_L_to_R)
integral = abs(get_umat_el(a, a, i, j) + get_umat_el(a, a, j, i)) / 2.0_dp
case (excit_type%single_overlap_R_to_L)
integral = abs(get_umat_el(a, b, i, i) + get_umat_el(b, a, i, i)) / 2.0_dp
case (excit_type%double_lowering, excit_type%double_raising)
cpt1 = (get_umat_el(a, b, i, j) + get_umat_el(b, a, j, i))
cpt2 = (get_umat_el(b, a, i, j) + get_umat_el(a, b, j, i))
cpt3 = abs(cpt1 + cpt2) / 2.0_dp
cpt4 = abs(cpt1 - cpt2) / 2.0_dp
cpt1 = abs(cpt1)
cpt2 = abs(cpt2)
if (flag_) then
integral = abs(cpt4)
else
integral = maxval(abs([cpt1, cpt2, cpt3, cpt4]))
end if
case (excit_type%double_L_to_R_to_L, excit_type%double_R_to_L_to_R, &
excit_type%double_L_to_R, excit_type%double_R_to_L)
cpt1 = (get_umat_el(a, b, j, i) + get_umat_el(b, a, i, j))
cpt2 = (get_umat_el(b, a, j, i) + get_umat_el(a, b, i, j))
cpt3 = abs(cpt2 - cpt1)
! cpt4 = abs(cpt1 + cpt2)
cpt4 = abs(cpt2 - 2.0_dp * cpt1)/2.0_dp
if (flag_) then
integral = abs(cpt2)
else
integral = maxval(abs([cpt1, cpt2 / 2.0_dp, cpt3, cpt4]))
end if
case (excit_type%fullstop_lowering, excit_type%fullstart_raising)
integral = abs(get_umat_el(a, a, i, j) + get_umat_el(a, a, j, i))/2.0_dp
case (excit_type%fullstop_raising, excit_type%fullstart_lowering)
integral = abs(get_umat_el(a, b, i, i) + get_umat_el(b, a, i, i))/2.0_dp
case (excit_type%fullstop_R_to_L, excit_type%fullstop_L_to_R)
integral = abs(get_umat_el(b, a, j, b) + get_umat_el(a, b, b, j))/2.0_dp
case (excit_type%fullstart_L_to_R, excit_type%fullstart_R_to_L)
integral = abs(get_umat_el(a, b, i, a) + get_umat_el(b, a, a, i))/2.0_dp
case (excit_type%fullstart_stop_alike)
integral = abs(get_umat_el(a, a, i, i))/2.0_dp
case (excit_type%fullstart_stop_mixed)
integral = abs(get_umat_el(a, i, i, a) + get_umat_el(i, a, a, i)) / 2.0_dp
#ifdef DEBUG_
case default
call stop_all(this_routine, "wrong excit-type")
#endif
end select
end function get_pchb_integral_contrib