| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(type_map_node_to_element), | intent(inout) | :: | self | |||
| integer(kind=int32), | intent(in) | :: | num_nodes | |||
| type(holder_elements), | intent(in) | :: | elements(:) |
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