Enumerate all occurring blocksizes
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
integer, | DIMENSION(:), POINTER, CONTIGUOUS | :: | blk_sizes | |||
integer, | intent(in) | :: | max_size | |||
integer, | DIMENSION(:), POINTER, CONTIGUOUS | :: | enum | |||
integer, | DIMENSION(:), POINTER, CONTIGUOUS | :: | rev_enum |
SUBROUTINE enumerate_blk_sizes(blk_sizes, max_size, enum, rev_enum)
!! Enumerate all occurring blocksizes
INTEGER, DIMENSION(:), POINTER, CONTIGUOUS :: blk_sizes
INTEGER, INTENT(IN) :: max_size
INTEGER, DIMENSION(:), POINTER, CONTIGUOUS :: enum, rev_enum
CHARACTER(len=*), PARAMETER :: routineN = 'enumerate_blk_sizes'
INTEGER :: handle, i, n
CALL timeset(routineN, handle)
ALLOCATE (enum(0:max_size))
enum(:) = 0
DO i = 1, SIZE(blk_sizes)
enum(blk_sizes(i)) = 1
END DO
n = SUM(enum)
ALLOCATE (rev_enum(n))
n = 0
DO i = 0, SIZE(enum) - 1
IF (enum(i) > 0) THEN
n = n + 1
enum(i) = n
rev_enum(n) = i
END IF
END DO
CALL timestop(handle)
END SUBROUTINE enumerate_blk_sizes