unique_edges Function

private function unique_edges(pairs, n) result(edges)

Edges (2, k) of vertex numbers (1 to n), each once whichever its direction (sorted by their smaller vertex, then the larger).

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: pairs(:,:)

(2, k) vertex numbers, in either order

integer, intent(in) :: n

the number of vertices

Return Value integer, allocatable, (:,:)


Calls

proc~~unique_edges~~CallsGraph proc~unique_edges unique_edges proc~sort_keys sort_keys proc~unique_edges->proc~sort_keys

Called by

proc~~unique_edges~~CalledByGraph proc~unique_edges unique_edges proc~set_faces Polyhedron%set_faces proc~set_faces->proc~unique_edges proc~set_triangles Polyhedron%set_triangles proc~set_triangles->proc~unique_edges

Source Code

    function unique_edges(pairs, n) result(edges)
        integer, intent(in) :: pairs(:,:)                   !! (2, k) vertex numbers, in either order
        integer, intent(in) :: n                            !! the number of vertices
        integer, allocatable :: edges(:,:)
        integer(int64), allocatable :: keys(:)
        integer :: k, m
        allocate(keys(size(pairs, 2)))
        keys = int(min(pairs(1, :), pairs(2, :)), int64) * (int(n, int64) + 1) + int(max(pairs(1, :), pairs(2, :)), int64)
        call sort_keys(keys)
        allocate(edges(2, size(keys)))
        m = 0
        do k = 1, size(keys)
            if (k > 1) then
                if (keys(k) == keys(k - 1)) cycle
            end if
            m = m + 1
            edges(:, m) = [int(keys(k) / (int(n, int64) + 1)), int(modulo(keys(k), int(n, int64) + 1))]
        end do
        edges = edges(:, 1:m)
    end function unique_edges