Rank key(1:n) ascending: perm(k) is the index of the k-th smallest key. Heapsort, so O(n log n) worst case and no scratch beyond perm itself. Local rather than the equivalent mrgrnk vendored with octree-mg, to keep the callers independent of the multigrid solver.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer, | intent(in) | :: | n | |||
| integer, | intent(in) | :: | key(:) | |||
| integer, | intent(out) | :: | perm(:) |
subroutine rank_keys(n, key, perm) integer, intent(in) :: n, key(:) integer, intent(out) :: perm(:) integer :: i, j, l, ir, tmp do i = 1, n perm(i) = i end do if (n < 2) return l = n/2 + 1 ir = n do if (l > 1) then l = l - 1 tmp = perm(l) else tmp = perm(ir) perm(ir) = perm(1) ir = ir - 1 if (ir == 1) then perm(1) = tmp exit end if end if i = l j = l + l do while (j <= ir) if (j < ir) then if (key(perm(j)) < key(perm(j+1))) j = j + 1 end if if (key(tmp) < key(perm(j))) then perm(i) = perm(j) i = j j = j + j else j = ir + 1 end if end do perm(i) = tmp end do end subroutine rank_keys