Matches row/block sizes and offsets to a given distribution
Used for making matrices dense/undense
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(array_i1d_obj), | intent(in) | :: | old_sizes | |||
type(array_i1d_obj), | intent(in) | :: | mapping | |||
integer, | intent(in) | :: | nel_new | |||
type(array_i1d_obj), | intent(out) | :: | new_sizes |
SUBROUTINE make_sizes_dense(old_sizes, mapping, nel_new, new_sizes)
!! Matches row/block sizes and offsets to a given distribution
!! @note Used for making matrices dense/undense
TYPE(array_i1d_obj), INTENT(IN) :: old_sizes, mapping
INTEGER, INTENT(IN) :: nel_new
TYPE(array_i1d_obj), INTENT(OUT) :: new_sizes
INTEGER :: el, nel_old
INTEGER, DIMENSION(:), POINTER, CONTIGUOUS :: map, new_s, old_s
! ---------------------------------------------------------------------------
map => array_data(mapping)
old_s => array_data(old_sizes)
nel_old = array_size(old_sizes)
ALLOCATE (new_s(nel_new))
new_s(:) = 0
DO el = 1, nel_old
new_s(map(el)) = new_s(map(el)) + old_s(el)
END DO
CALL array_new(new_sizes, new_s, gift=.TRUE.)
END SUBROUTINE make_sizes_dense