build_csr_from_edges Subroutine

private subroutine build_csr_from_edges(self, edge_i_in, edge_j_in, edge_count_in)

Arguments

Type IntentOptional Attributes Name
class(type_node_adjacency), intent(inout) :: self
integer(kind=int32), intent(in) :: edge_i_in(:)
integer(kind=int32), intent(in) :: edge_j_in(:)
integer(kind=int32), intent(in) :: edge_count_in

Calls

proc~~build_csr_from_edges~~CallsGraph proc~build_csr_from_edges build_csr_from_edges interface~allocate_array allocate_array proc~build_csr_from_edges->interface~allocate_array interface~deallocate_array deallocate_array proc~build_csr_from_edges->interface~deallocate_array sort sort proc~build_csr_from_edges->sort proc~allocate_rank1_int16 allocate_rank1_int16 interface~allocate_array->proc~allocate_rank1_int16 proc~allocate_rank1_int32 allocate_rank1_int32 interface~allocate_array->proc~allocate_rank1_int32 proc~allocate_rank1_int64 allocate_rank1_int64 interface~allocate_array->proc~allocate_rank1_int64 proc~allocate_rank1_int8 allocate_rank1_int8 interface~allocate_array->proc~allocate_rank1_int8 proc~allocate_rank1_logical1 allocate_rank1_logical1 interface~allocate_array->proc~allocate_rank1_logical1 proc~allocate_rank1_logical4 allocate_rank1_logical4 interface~allocate_array->proc~allocate_rank1_logical4 proc~allocate_rank1_logical8 allocate_rank1_logical8 interface~allocate_array->proc~allocate_rank1_logical8 proc~allocate_rank1_real128 allocate_rank1_real128 interface~allocate_array->proc~allocate_rank1_real128 proc~allocate_rank1_real32 allocate_rank1_real32 interface~allocate_array->proc~allocate_rank1_real32 proc~allocate_rank1_real64 allocate_rank1_real64 interface~allocate_array->proc~allocate_rank1_real64 proc~allocate_rank2_int16 allocate_rank2_int16 interface~allocate_array->proc~allocate_rank2_int16 proc~allocate_rank2_int32 allocate_rank2_int32 interface~allocate_array->proc~allocate_rank2_int32 proc~allocate_rank2_int64 allocate_rank2_int64 interface~allocate_array->proc~allocate_rank2_int64 proc~allocate_rank2_int8 allocate_rank2_int8 interface~allocate_array->proc~allocate_rank2_int8 proc~allocate_rank2_logical1 allocate_rank2_logical1 interface~allocate_array->proc~allocate_rank2_logical1 proc~allocate_rank2_logical4 allocate_rank2_logical4 interface~allocate_array->proc~allocate_rank2_logical4 proc~allocate_rank2_logical8 allocate_rank2_logical8 interface~allocate_array->proc~allocate_rank2_logical8 proc~allocate_rank2_real128 allocate_rank2_real128 interface~allocate_array->proc~allocate_rank2_real128 proc~allocate_rank2_real32 allocate_rank2_real32 interface~allocate_array->proc~allocate_rank2_real32 proc~allocate_rank2_real64 allocate_rank2_real64 interface~allocate_array->proc~allocate_rank2_real64 proc~deallocate_rank1_int32 deallocate_rank1_int32 interface~deallocate_array->proc~deallocate_rank1_int32 proc~deallocate_rank1_int64 deallocate_rank1_int64 interface~deallocate_array->proc~deallocate_rank1_int64 proc~deallocate_rank1_int8 deallocate_rank1_int8 interface~deallocate_array->proc~deallocate_rank1_int8 proc~deallocate_rank1_logical1 deallocate_rank1_logical1 interface~deallocate_array->proc~deallocate_rank1_logical1 proc~deallocate_rank1_logical4 deallocate_rank1_logical4 interface~deallocate_array->proc~deallocate_rank1_logical4 proc~deallocate_rank1_logical8 deallocate_rank1_logical8 interface~deallocate_array->proc~deallocate_rank1_logical8 proc~deallocate_rank1_real128 deallocate_rank1_real128 interface~deallocate_array->proc~deallocate_rank1_real128 proc~deallocate_rank1_real32 deallocate_rank1_real32 interface~deallocate_array->proc~deallocate_rank1_real32 proc~deallocate_rank1_real64 deallocate_rank1_real64 interface~deallocate_array->proc~deallocate_rank1_real64 proc~deallocate_rank2_int32 deallocate_rank2_int32 interface~deallocate_array->proc~deallocate_rank2_int32 proc~deallocate_rank2_int64 deallocate_rank2_int64 interface~deallocate_array->proc~deallocate_rank2_int64 proc~deallocate_rank2_int8 deallocate_rank2_int8 interface~deallocate_array->proc~deallocate_rank2_int8 proc~deallocate_rank2_logical1 deallocate_rank2_logical1 interface~deallocate_array->proc~deallocate_rank2_logical1 proc~deallocate_rank2_logical4 deallocate_rank2_logical4 interface~deallocate_array->proc~deallocate_rank2_logical4 proc~deallocate_rank2_logical8 deallocate_rank2_logical8 interface~deallocate_array->proc~deallocate_rank2_logical8 proc~deallocate_rank2_real128 deallocate_rank2_real128 interface~deallocate_array->proc~deallocate_rank2_real128 proc~deallocate_rank2_real32 deallocate_rank2_real32 interface~deallocate_array->proc~deallocate_rank2_real32 proc~deallocate_rank2_real64 deallocate_rank2_real64 interface~deallocate_array->proc~deallocate_rank2_real64 proc~error_message error_message proc~allocate_rank1_int16->proc~error_message proc~allocate_rank1_int32->proc~error_message proc~allocate_rank1_int64->proc~error_message proc~allocate_rank1_int8->proc~error_message proc~allocate_rank1_logical1->proc~error_message proc~allocate_rank1_logical4->proc~error_message proc~allocate_rank1_logical8->proc~error_message proc~allocate_rank1_real128->proc~error_message proc~allocate_rank1_real32->proc~error_message proc~allocate_rank1_real64->proc~error_message proc~allocate_rank2_int16->proc~error_message proc~allocate_rank2_int32->proc~error_message proc~allocate_rank2_int64->proc~error_message proc~allocate_rank2_int8->proc~error_message proc~allocate_rank2_logical1->proc~error_message proc~allocate_rank2_logical4->proc~error_message proc~allocate_rank2_logical8->proc~error_message proc~allocate_rank2_real128->proc~error_message proc~allocate_rank2_real32->proc~error_message proc~allocate_rank2_real64->proc~error_message proc~deallocate_rank1_int32->proc~error_message proc~deallocate_rank1_int64->proc~error_message proc~deallocate_rank1_int8->proc~error_message proc~deallocate_rank1_logical1->proc~error_message proc~deallocate_rank1_logical4->proc~error_message proc~deallocate_rank1_logical8->proc~error_message proc~deallocate_rank1_real128->proc~error_message proc~deallocate_rank1_real32->proc~error_message proc~deallocate_rank1_real64->proc~error_message proc~deallocate_rank2_int32->proc~error_message proc~deallocate_rank2_int64->proc~error_message proc~deallocate_rank2_int8->proc~error_message proc~deallocate_rank2_logical1->proc~error_message proc~deallocate_rank2_logical4->proc~error_message proc~deallocate_rank2_logical8->proc~error_message proc~deallocate_rank2_real128->proc~error_message proc~deallocate_rank2_real32->proc~error_message proc~deallocate_rank2_real64->proc~error_message log_error log_error proc~error_message->log_error

Called by

proc~~build_csr_from_edges~~CalledByGraph proc~build_csr_from_edges build_csr_from_edges proc~initialize_node_adjacency type_node_adjacency%initialize_node_adjacency proc~initialize_node_adjacency->proc~build_csr_from_edges proc~build_node_adjacency_from_elements build_node_adjacency_from_elements proc~build_node_adjacency_from_elements->proc~initialize_node_adjacency proc~cm_reorder_method cm_reorder_method proc~cm_reorder_method->proc~build_node_adjacency_from_elements proc~rcm_reorder_method rcm_reorder_method proc~rcm_reorder_method->proc~build_node_adjacency_from_elements interface~cm_reorder_method type_reordering%cm_reorder_method interface~cm_reorder_method->proc~cm_reorder_method interface~rcm_reorder_method type_reordering%rcm_reorder_method interface~rcm_reorder_method->proc~rcm_reorder_method proc~initialize_type_reordering type_reordering%initialize_type_reordering proc~initialize_type_reordering->interface~cm_reorder_method proc~initialize_type_reordering->interface~rcm_reorder_method

Source Code

    subroutine build_csr_from_edges(self, edge_i_in, edge_j_in, edge_count_in)
        class(type_node_adjacency), intent(inout) :: self
        integer(int32), intent(in) :: edge_i_in(:), edge_j_in(:), edge_count_in

        integer(int64), allocatable :: sort_keys(:)
        integer(int32), allocatable :: temp_deg(:), temp_pos(:)
        integer(int32) :: unique_count, i, n1, n2, total_adj

        if (edge_count_in == 0) then
            call allocate_array(self%ptr, self%num_nodes + 1_int32)
            call allocate_array(self%ind, 0_int32)
            self%ptr = 1
            return
        end if

        call allocate_array(sort_keys, int(edge_count_in, kind=int64))
        do i = 1, edge_count_in
            sort_keys(i) = int(edge_i_in(i), int64) * (self%num_nodes + 1) &
                           + int(edge_j_in(i), int64)
        end do
        call sort(sort_keys)

        unique_count = 1
        do i = 2, edge_count_in
            if (sort_keys(i) > sort_keys(i - 1)) then
                unique_count = unique_count + 1
                sort_keys(unique_count) = sort_keys(i)
            end if
        end do

        call allocate_array(temp_deg, self%num_nodes)
        temp_deg = 0

        do i = 1, unique_count
            n1 = int(sort_keys(i) / (self%num_nodes + 1))
            n2 = int(mod(sort_keys(i), int(self%num_nodes + 1, int64)))
            temp_deg(n1) = temp_deg(n1) + 1
            temp_deg(n2) = temp_deg(n2) + 1
        end do

        call allocate_array(self%ptr, self%num_nodes + 1_int32)
        self%ptr(1) = 1
        do i = 1, self%num_nodes
            self%ptr(i + 1) = self%ptr(i) + temp_deg(i)
        end do

        total_adj = self%ptr(self%num_nodes + 1) - 1
        call allocate_array(self%ind, total_adj)
        call allocate_array(temp_pos, self%num_nodes)
        temp_pos = self%ptr(1:self%num_nodes)

        do i = 1, unique_count
            n1 = int(sort_keys(i) / (self%num_nodes + 1))
            n2 = int(mod(sort_keys(i), int(self%num_nodes + 1, int64)))
            self%ind(temp_pos(n1)) = n2
            temp_pos(n1) = temp_pos(n1) + 1
            self%ind(temp_pos(n2)) = n1
            temp_pos(n2) = temp_pos(n2) + 1
        end do

        call deallocate_array(sort_keys)
        call deallocate_array(temp_deg)
        call deallocate_array(temp_pos)
    end subroutine build_csr_from_edges