Finds internal offsets For all local blocks in blk_local_els, it calculates its offset in the dense block to which it belongs.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
integer, | intent(in), | DIMENSION(:) | :: | blk_local_els | ||
integer, | intent(in), | DIMENSION(:) | :: | el_map | ||
integer, | intent(in), | DIMENSION(:) | :: | blk_el_offsets | ||
integer, | intent(in), | DIMENSION(:) | :: | dense_el_offsets | ||
integer, | intent(out), | DIMENSION(:) | :: | internal_offsets |
SUBROUTINE get_internal_offsets(blk_local_els, el_map, blk_el_offsets, &
dense_el_offsets, internal_offsets)
!! Finds internal offsets
!! For all local blocks in blk_local_els, it calculates its offset in
!! the dense block to which it belongs.
INTEGER, DIMENSION(:), INTENT(IN) :: blk_local_els, el_map, blk_el_offsets, &
dense_el_offsets
INTEGER, DIMENSION(:), INTENT(OUT) :: internal_offsets
INTEGER :: blk_el, d_el, i, ndense, nlblk
INTEGER, ALLOCATABLE, DIMENSION(:) :: off_acc
! ---------------------------------------------------------------------------
nlblk = SIZE(blk_local_els)
ndense = SIZE(dense_el_offsets)
ALLOCATE (off_acc(ndense))
off_acc(:) = 0
internal_offsets(:) = 0
DO i = 1, nlblk
blk_el = blk_local_els(i)
d_el = el_map(blk_el)
internal_offsets(blk_el) = off_acc(d_el)
off_acc(d_el) = off_acc(d_el) + blk_el_offsets(blk_el + 1) - blk_el_offsets(blk_el)
END DO
DEALLOCATE (off_acc)
END SUBROUTINE get_internal_offsets