cm_reorder_method Module Subroutine

module subroutine cm_reorder_method(self, elements)

Arguments

Type IntentOptional Attributes Name
class(type_reordering), intent(inout) :: self
type(holder_elements), intent(in) :: elements(:)

Calls

proc~~cm_reorder_method~~CallsGraph proc~cm_reorder_method cm_reorder_method interface~allocate_array allocate_array proc~cm_reorder_method->interface~allocate_array interface~deallocate_array deallocate_array proc~cm_reorder_method->interface~deallocate_array proc~build_node_adjacency_from_elements build_node_adjacency_from_elements proc~cm_reorder_method->proc~build_node_adjacency_from_elements proc~error_message error_message proc~cm_reorder_method->proc~error_message proc~execute_cm_ordering execute_cm_ordering proc~cm_reorder_method->proc~execute_cm_ordering proc~find_start_node find_start_node proc~cm_reorder_method->proc~find_start_node proc~get_node_degree type_node_adjacency%get_node_degree proc~cm_reorder_method->proc~get_node_degree proc~get_num_nodes~2 type_node_adjacency%get_num_nodes proc~cm_reorder_method->proc~get_num_nodes~2 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~build_node_adjacency_from_elements->interface~allocate_array proc~build_node_adjacency_from_elements->interface~deallocate_array proc~initialize_node_adjacency type_node_adjacency%initialize_node_adjacency proc~build_node_adjacency_from_elements->proc~initialize_node_adjacency log_error log_error proc~error_message->log_error proc~sort_and_enqueue_neighbors sort_and_enqueue_neighbors proc~execute_cm_ordering->proc~sort_and_enqueue_neighbors 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 proc~initialize_node_adjacency->interface~deallocate_array proc~build_csr_from_edges build_csr_from_edges proc~initialize_node_adjacency->proc~build_csr_from_edges proc~generate_all_edges generate_all_edges proc~initialize_node_adjacency->proc~generate_all_edges proc~sort_and_enqueue_neighbors->interface~allocate_array proc~sort_and_enqueue_neighbors->interface~deallocate_array proc~get_node_neighbors type_node_adjacency%get_node_neighbors proc~sort_and_enqueue_neighbors->proc~get_node_neighbors sort_index sort_index proc~sort_and_enqueue_neighbors->sort_index proc~build_csr_from_edges->interface~allocate_array proc~build_csr_from_edges->interface~deallocate_array sort sort proc~build_csr_from_edges->sort proc~generate_all_edges->interface~allocate_array

Called by

proc~~cm_reorder_method~~CalledByGraph proc~cm_reorder_method cm_reorder_method interface~cm_reorder_method type_reordering%cm_reorder_method interface~cm_reorder_method->proc~cm_reorder_method proc~initialize_type_reordering type_reordering%initialize_type_reordering proc~initialize_type_reordering->interface~cm_reorder_method

Source Code

    module subroutine cm_reorder_method(self, elements)
        implicit none
        class(type_reordering), intent(inout) :: self
        type(holder_elements), intent(in) :: elements(:)

        type(type_node_adjacency) :: local_node_adj
        integer(int32) :: n_nodes, i, r_count, start_node, istat
        integer(int32), allocatable :: degree(:), R(:), Q(:)
        logical, allocatable :: visited(:)

        call build_node_adjacency_from_elements(elements, local_node_adj)
        n_nodes = local_node_adj%get_num_nodes()
        self%num_nodes = n_nodes
        if (n_nodes == 0) return

        call allocate_array(degree, length=n_nodes)
        do i = 1, n_nodes
            degree(i) = local_node_adj%get_degree(i)
        end do

        call allocate_array(R, length=n_nodes)
        call allocate_array(Q, length=n_nodes)
        call allocate_array(visited, length=n_nodes)
        visited = .false.
        r_count = 0

        do while (r_count < n_nodes)
            call find_start_node(n_nodes, degree, visited, start_node, istat)
            if (istat /= 0) then
                call error_message(931, c_opt="CM Reordering")
            end if
            call execute_cm_ordering(start_node, local_node_adj, degree, visited, Q, R, r_count)
        end do

        call deallocate_array(self%perm)
        call allocate_array(self%perm, length=n_nodes)
        self%perm(:) = R(:)

        self%is_reordered_perm = .true.
        self%is_reordered_iperm = .false.

        call deallocate_array(degree)
        call deallocate_array(R)
        call deallocate_array(Q)
        call deallocate_array(visited)
    end subroutine cm_reorder_method