initialize_fast Subroutine

private subroutine initialize_fast(self, num_nodes, elements)

Arguments

Type IntentOptional Attributes Name
class(type_map_node_to_element), intent(inout) :: self
integer(kind=int32), intent(in) :: num_nodes
type(holder_elements), intent(in) :: elements(:)

Calls

proc~~initialize_fast~~CallsGraph proc~initialize_fast initialize_fast proc~get_connectivity abst_mesh%get_connectivity proc~initialize_fast->proc~get_connectivity proc~get_num_nodes~3 abst_mesh%get_num_nodes proc~initialize_fast->proc~get_num_nodes~3

Called by

proc~~initialize_fast~~CalledByGraph proc~initialize_fast initialize_fast proc~initialize_map type_map_node_to_element%initialize_map proc~initialize_map->proc~initialize_fast

Source Code

    subroutine initialize_fast(self, num_nodes, elements)
        class(type_map_node_to_element), intent(inout) :: self
        integer(int32), intent(in) :: num_nodes
        type(holder_elements), intent(in) :: elements(:)

        integer(int32) :: i, ielem, inode_local, node_id, num_elements
        integer(int32), allocatable :: node_element_counts(:)
        integer(int32), allocatable :: current_indices(:)
        integer(int32), dimension(:), pointer :: ptr_connectivity => null()

        num_elements = size(elements)
        allocate (self%map_data(num_nodes))

        ! Phase 1: Count
        allocate (node_element_counts(num_nodes))
        node_element_counts = 0
        do ielem = 1, num_elements
            ptr_connectivity => elements(ielem)%e%get_connectivity()
            do inode_local = 1, elements(ielem)%e%get_num_nodes()
                node_id = ptr_connectivity(inode_local)
                if (node_id > 0 .and. node_id <= num_nodes) then
                    node_element_counts(node_id) = node_element_counts(node_id) + 1
                end if
            end do
        end do

        ! Phase 2: Allocate
        do i = 1, num_nodes
            if (node_element_counts(i) > 0) then
                allocate (self%map_data(i)%ids(node_element_counts(i)))
            end if
        end do
        deallocate (node_element_counts)

        ! Phase 3: Fill
        allocate (current_indices(num_nodes))
        current_indices = 1
        do ielem = 1, num_elements
            ptr_connectivity => elements(ielem)%e%get_connectivity()
            do inode_local = 1, elements(ielem)%e%get_num_nodes()
                node_id = ptr_connectivity(inode_local)
                if (node_id > 0 .and. node_id <= num_nodes) then
                    self%map_data(node_id)%ids(current_indices(node_id)) = ielem
                    current_indices(node_id) = current_indices(node_id) + 1
                end if
            end do
        end do
        deallocate (current_indices)
    end subroutine initialize_fast