subroutine gen_guga_tJ_cum_list(csf_i, id, cum_arr, tgt, tgt_pgen)
type(CSF_Info_t), intent(in) :: csf_i
integer, intent(in) :: id
real(dp), allocatable, intent(out) :: cum_arr(:)
integer, intent(in), optional :: tgt
real(dp), intent(out), optional :: tgt_pgen
integer, allocatable :: neighbors(:)
integer :: i, n
real(dp) :: cum_sum, tmp
neighbors = lat%get_neighbors(id)
allocate(cum_arr(size(neighbors)), source=0.0_dp)
cum_sum = 0.0_dp
tmp = 0.0_dp
if (present(tgt)) then
tgt_pgen = 0.0_dp
do i = 1, size(neighbors)
n = neighbors(i)
if (csf_i%stepvector(n) == 0) then
tmp = 1.0_dp
cum_sum = cum_sum + tmp
if (tgt == n) tgt_pgen = tmp
end if
end do
else
do i = 1, size(neighbors)
n = neighbors(i)
if (csf_i%stepvector(n) == 0) then
cum_sum = cum_sum + 1.0_dp
end if
cum_arr(i) = cum_sum
end do
end if
end subroutine gen_guga_tJ_cum_list