| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| real(kind=dp), | intent(in) | :: | cum_arr(:) | |||
| real(kind=dp), | intent(in) | :: | cum_sum | |||
| integer, | intent(out) | :: | ind | |||
| real(kind=dp), | intent(out) | :: | pgen |
subroutine pick_from_cum_list(cum_arr, cum_sum, ind, pgen) real(dp), intent(in) :: cum_arr(:), cum_sum integer, intent(out) :: ind real(dp), intent(out) :: pgen real(dp) :: r if (cum_sum < EPS) then ind = -1 pgen = 0.0_dp return end if r = genrand_real2_dsfmt() * cum_sum ind = binary_search_first_ge(cum_arr, r) if (ind == 1) then pgen = cum_arr(1) / cum_sum else pgen = (cum_arr(ind) - cum_arr(ind - 1)) / cum_sum end if end subroutine pick_from_cum_list